Logo de Torre de Babel
Portada Libros Diseño web Artículos Glosario RSS
Buscar

Lenguajes para programar shaders (III) - HLSL

HLSL (High Level Shading Language) es un lenguaje de programación de shaders, similar a Cg, creado por Microsoft y que, en consecuencia, se usa conjuntamente con DirectX. En realidad HLSL ha sido desarrollado de manera conjunta por Microsoft y nVidia, siendo ésta la razón de su similitud con Cg.

Al igual que ocurre con Cg, los shaders escritos con HLSL pueden ser compilados desde la línea de comandos, generando un módulo con código preparado para transferir a la GPU, o bien introducirse como código fuente en un programa DirectX, en cuyo caso se compilarían durante la ejecución.

Dependiendo de la versión de DirectX con la que se trabaje, HLSL permitirá usar unas versiones u otras del Shader Model. Con DirectX 9 puede elegirse entre las versiones 1, 2 y 3 de SM, mientras que con DirectX 10 la única opción es el SM 4.0, es decir, la última versión. Esto es así porque DirectX 10 está diseñado para funcionar sobre un cauce gráfico totalmente programable, sin hacer uso de las etapas fijas clásicas que se describieron al principio de este documento.

¿Qué se necesita para poder programar shaders con HLSL? Únicamente el DirectX SDK, disponible gratuitamente en la web de Microsoft. Éste incluye, aparte de todas las herramientas necesarias, un gran conjunto de aplicaciones de ejemplo y documentación, accesibles a través del visor mostrado en la figura inferior.

DirectX Sample Browser

Para crear y utilizar un shader con HLSL, asumiendo que está utilizándose DirectX 10, habría que seguir los pasos indicados a continuación:

  • Escribir el código del shader almacenándolo en un archivo de texto, como se haría con cualquier otro código fuente.
  • En el programa DirectX, utilizar la función D3D10CompileShader() para compilar el shader y obtener su versión binaria.
  • A continuación, usando la versión binaria, se genera el shader en el dispositivo con el que está trabajándose mediante el método Create{Vertex|Pixel|Geometry}Shader(). Éste devuelve un puntero al shader que ya estará alojado en la GPU.
  • Por último se activa el shader para introducirlo en el cauce gráfico, usando para el método {GS|PS|VS}SetShader().

Un método alternativo consiste en utilizar un formato de archivo específico de DirectX, con extensión .fx, en el que pueden introducirse múltiples shaders, por ejemplo uno para vértices, otro para geometría y un tercero para fragmentos, usando la función D3DX10CreateEffectFromFile() para cargarlos de manera conjunta. En la imagen inferior puede verse el entorno de Visual Studio 2008, con un programa DirectX 10 en la parte superior que recupera un PS y un VS de un archivo de efectos. Ésta es el que establece los shaders a compilar y transferir a la GPU.

Shaders en Visual Studio


Publicado el 17/2/2010

Curso de shaders

Torre de Babel - Francisco Charte Ojeda - Desde 1997 en la Web