Logo de Torre de Babel
Portada Libros Artículos Perfil Scholar

Lenguajes para programar shaders (IV) - OGSL

Al igual que DirectX, la otra gran API para programación gráfica, que es OpenGL, también cuenta con su propio lenguaje de desarrollo de shaders. Dicho lenguaje se denomina OGLSL (Open GL Shading Language), si bien también es posible encontrar la denominación GLSL.

OGLSL es un lenguaje basado en el C estándar, como Cg y HLSL, por lo que tiene muchas similitudes con éstos. La última versión disponible, en cuanto a especificación, es la 1.5, anunciada en julio de 2009. La mayor parte del hardware actual, no obstante, aún no soporta las características de dicha versión, asociada a OpenGL 3.1/3.2. Habrá que esperar hasta que los fabricantes, principalmente nVidia y ATI (AMD), actualicen sus controladores.

El 5 de mayo de 2009 nVidia actualizó sus controladores para Windows, Linux y otros sistemas operativos incluyendo soporte para OpenGL 3.1 y la versión 1.3 de OGLSL. Están disponibles en la Developer Zone de nVidia.

En realidad OGLSL no es un lenguaje, sino dos lenguajes diferentes con ciertos puntos en común. Uno de los lenguajes es específico para la creación de VS y otro para los PS. No existe (hasta la versión 1.4), por el momento, soporte para GS, si bien sí hay disponible una extensión para OpenGL que permite utilizarlos.

Inicialmente el soporte de OGLSL en OpenGL dependía de las extensiones GL_ARB_vertex_shader y GL_ARB_fragment_shader, siendo necesario instalarlas y cargarlas desde los programas OpenGL. Este trabajo puede simplificarse gracias a GLEW (OpenGL Extension Wrangler Library). A partir de OpenGL 2.0, sin embargo, dichas extensiones ya no son precisas y se pueden escribir shaders OGLSL con menos complicaciones.

Asumiendo que se tiene instalado OpenGL 2.0 o posterior en el sistema, y que los controladores de vídeo soportan OGLSL (todos los últimos productos de nVidia y ATI lo soportan), el proceso a seguir constaría de los pasos indicados a continuación:

  • Escribir el código del shader almacenándolo en una cadena de texto o recuperándolo del archivo donde esté guardado.
  • Invocar a glCreateShader() para crear en OpenGL un objeto interno que representa al shader, facilitándole el código fuente almacenado antes en la cadena mediante la función glShaderSource().
  • Compilar el shader, llamando a la función glCompileShader().
  • A continuación hay que crear un programa en memoria para alojar los shaders, tarea de la que se ocupa la función glCreateProgram().
  • Por cada shader, previamente cargado y compilado con las funciones ya mencionadas, habrá que hacer una llamada a glAttachShader(). De esta forma los shaders se asocian con el objeto devuelto por glCreateProgram().
  • Finalmente hay que vincular (linkar) el programa con todos los shaders, llamando a la función glLinkProgram(), e instalar los shaders en la GPU mediante la función glUseProgram().

El procedimiento puede parecer largo pero es muy mecánico, de forma que podemos concentrar nuestro esfuerzo en escribir los shaders con OGLSL e instalarlos reproduciendo siempre estos mismos pasos.

La programación de GS en OpenGL requiere actualmente el uso de la extensión GL_EXT_geometry_shader4. Una vez cargada y activada, básicamente se dispone de dos métodos adicionales: EmitVertex() y EndPrimitive(). El primero envía un vértice a la siguiente etapa del cauce, pudiendo ser invocado múltiples veces por cada ejecución del GS. El segundo marca el fin de la primitiva generada a partir de los datos de entrada, siendo opcional en caso de que el GS genere una lista de puntos como primitiva.


Publicado el 4/3/2010

Histórico
Curso de shaders

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