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

Lenguajes para programar shaders (II) - Cg

DirectX y OpenGL son interfaces de programación, lo que en la jerga de los programadores se conoce como bibliotecas de funciones o servicios. Estas interfaces aportan una cierta funcionalidad y pueden ser utilizadas desde distintos lenguajes de programación, pero no son en sí un lenguaje, sino un conjunto de funciones. Cg, por el contrario, es un lenguaje de programación, no una biblioteca de servicios, siendo en este sentido una herramienta similar al lenguaje ensamblador mencionado en la primera entrada de esta serie.

Lo que ofrece Cg es la posibilidad de usar un lenguaje de alto nivel, similar al lenguaje C, para efectuar operaciones que, hasta el momento en que nVidia presentó Cg, se realizaban en un cierto lenguaje ensamblador. Cg ha sido desarrollado por nVidia y el paquete de herramientas para utilizarlo, de manera conjunta con Direct3D u OpenGL, está disponible desde principios de 2003. Aparte del compilador de Cg, la documentación y diversas utilidades, también es posible obtener el código fuente sin ningún coste bajo una licencia abierta.

Cg no puede utilizarse para crear una aplicación gráfica completa, como DirectX y OpenGL. Su uso siempre es complementario con estas bibliotecas, no en competencia con ellas. Podemos servirnos de Cg en Windows, ya sea con DirectX u OpenGL, así como en Linux y Mac OS X, en estos dos casos con OpenGL. La figura inferior representa la estructura general de una aplicación en la que se utilizase Cg.

Diagrama Cg

Para usar Cg lo primero que se precisará será el conocido como Cg Toolkit, un paquete de herramientas, ejemplos y documentación ofrecidos por Nvidia. Además del compilador para un sistema u otro, también existen plug-ins para distintas aplicaciones gráficas de uso general, como son 3ds max y Maya.

Una vez instalado el paquete de desarrollo, la creación de PS y VS con el lenguaje Cg se completa básicamente siguiendo dos procedimientos diferentes. El primero de ellos consiste en introducir el código fuente de los shaders en un archivo de texto, como cualquier otro programa, usando a continuación el compilador de Cg desde la línea de comandos. Mediante una opción indicaríamos el perfil al que debe ajustarse el compilador, que generaría un módulo de código en ensamblador ajustado a DirectX 8, DirectX 9 o diferentes extensiones de OpenGL para shaders. Ese módulo sería el que se utilizaría en la aplicación DirectX u OpenGL, facilitándolo con el API adecuado a la GPU.

Compilador de Cg desde la línea de comandos

La segunda opción, mucho más flexible, consiste en usar la biblioteca de ejecución de Cg, mediante la cual es posible compilar el código de los shaders en ejecución, sin necesidad de recurrir al compilador manualmente. Dependiendo de que usemos DirectX 8, DirectX 9 u OpenGL añadiremos un archivo de cabecera u otro a nuestro programa, utilizando a continuación un pequeño conjunto de funciones mediante las cuales se establecerá el contexto para los shaders y, facilitando una cadena de caracteres con su código, efectuará la compilación y obtendrá el código ensamblador correspondiente.

La actual versión de Cg, la 2.2 liberada en octubre de 2009, contempla el uso de distintas versiones de PS, VS y GS, siendo actualizado periódicamente por parte de nVidia. Es un recurso para programadores interesante y totalmente gratuito.


Publicado el 14/1/2010

Estadísticas de Torre de Babel en 2009

Salvo durante los primeros meses de vida del Rincón del programador, primer nombre que tuvo mi sitio web a finales de 1996 y que posteriormente cambió al actual Torre de Babel en 1997, lo cierto es que nunca me he preocupado por el número de visitas que recibía, su procedencia ni detalles de este tipo, hasta tal punto de que cuando alguna empresa, interesada en colocar publicidad pagándola, me ha pedido que les facilitase información de tráfico no he podido facilitársela. Tampoco es algo que me preocupe, ya que nunca pensé en Torre de Babel como una fuente de ingresos y, las pocas veces que ha existido, la publicidad que he puesto temporalmente ha sido más por hacer un favor que otra cosa.

El caso es que hace tiempo, coincidiendo con la puesta en marcha de otro sitio, coloqué aquí el código necesario para hacer un seguimiento con Google Analytics, un conocido servicio gratuito muy interesante. Los siguientes son algunos datos relativos al tráfico de Torre de Babel durante el pasado año 2009.

Gráfica de visitasEl gráfico de barras situado a la izquierda muestra el número total de visitas durante 2009, así como el número de visitas únicas, las páginas servidas y el volumen de tráfico generado. Resumiendo grosso modo: en torno a 200.000 visitas, con 320.000 páginas vistas y unos 40 GB de tráfico.
El gráfico de sectores de la derecha indica cuál es la procedencia de esas visitas que, como puede verse, se reparte casi equitativamente entre motores de búsqueda, el tráfico directo (que accede conociendo la dirección) y los sitios web que me enlazan.

Como curiosidad, decir que las entradas a través de buscadores se producen principalmente usando como términos mi nombre y primer apellido o directamente el nombre del sitio, por lo que presumo que son personas que quieren acceder a Torre de Babel pero desconocen la dirección.

Procedencia de las visitas
NavegadoresEn cuanto a los navegadores de los visitantes de Torre de Babel, en el gráfico de la izquierda puede apreciarse que Internet Explorer sigue siendo la opción mayoritaria, seguido muy de cerca por Firefox. Opciones minoritarias son Chrome, Opera, Safari o Konqueror.
Finalmente, en cuanto a los sistemas operativos que utilizan las personas que visitan este sitio, Windows sigue siendo la opción mayoritaria con mucha diferencia tal y como se aprecia en la gráfica de la derecha, superando ligeramente el 96 por ciento. Le siguen Linux y Mac, y me sorprendió ver que hay gente que ha accedido desde teléfonos móviles iPhone, son SymbianOS o Android.Sistemas

Publicado el 12/1/2010

Lenguajes para programar shaders - Ensamblador

Al igual que el propio hardware, también el software asociado al desarrollo de shaders ha ido evolucionando con el paso del tiempo. Originalmente no existía más que el ensamblador, como en los primeros computadores, apareciendo con posterioridad lenguajes de más alto nivel como Cg, HLSL y OGLSL.

El primer fabricante de hardware en introducir shaders en sus productos fue nVidia, por lo que no es de extrañar que el primer lenguaje para desarrollar estos programas provenga también de dicha empresa. Se trataba de un lenguaje de bajo nivel, equivalente al ensamblador usado habitualmente en los microprocesadores y específico para el hardware de nVidia.

Paralelamente Microsoft introdujo en el DirectX 8.1 SDK su propio ensamblador para shaders, diseñado para su uso desde Direct3D (no es necesario un ensamblador externo) y con la importante ventaja, respecto al de nVidia, de ser independiente del hardware. Esto significa que puede escribir el código de un shader y utilizarlo en placas de nVidia y ATI sin cambios.

El lenguaje ensamblador para shaders de Microsoft recuerda al de cualquier procesador de tipo RISC (Reduced Instruction Set Computer), al estar formado por un conjunto limitado de instrucciones carga/almacenamiento cuya sintaxis general es la siguiente:


codop destino, origen1[, origen2[, ...]]

Cada línea se inicia con un código de operación: el nombre de la instrucción que indica la acción a llevar a cabo. A continuación se especifica cuál será el destino de la operación y de dónde procederán los datos en los que se operará. Esos datos, así como el destino, serán normalmente vectores de tres o cuatro componentes, no simples números enteros o en coma flotante.

Las instrucciones de este ensamblador específico para shaders realizan sumas y productos corrientes, pero también productos escalares y vectoriales, productos matriciales, logaritmos, cálculos de coeficientes de luz, de vectores distancia, etc.

Para crear shaders con este lenguaje ensamblador no se precisa ninguna herramienta externa siempre que se programe con DirectX, basta con introducir el código del shader en una cadena de texto y facilitarla como argumento a la función D3DXAssembleShader(). Ésta efectuará el ensamblado y enviará el código resultante a la GPU, dejando el shader listo para usar.

Aunque es completamente factible seguir desarrollando shaders en ensamblador, en la práctica la aparición de lenguajes de alto nivel (como los que se describirán en entradas posteriores) ha provocado, como en la programación de aplicaciones para CPU, que el ensamblador vaya abandonándose paulatinamente. En el caso de los shaders esto es aún más lógico si cabe, ya que el uso de un lenguaje de alto nivel no implica ninguna pérdida de rendimiento. Al final todos ellos generan ensamblador y éste se compila y envía a la GPU de la misma manera.

Si se pretende usar el lenguaje ensamblador para crear shaders las dos referencias indispensables son Referencia de instrucciones ensamblador de la especificación PS 2.0 y Referencia de instrucciones ensamblador de la especificación VS 2.0, alojadas en MSDN.


Publicado el 8/1/2010

Histórico
Curso de shaders

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