Este lenguaje fue diseñado específicamente para las acelaradoras y es de gráficas, no es de ser utilizado como lenguaje propósito general. Por el contrario, el lenguaje : (también orientado a programación de GPU) sí puede ser utilizado para aplicaciones de propósito general.
Descripción general
En un primer momento, las aceleradoras se programaban en bajo nivel, utilizando directamente el repertorio de instrucciones de los procesadores de GPU y é . Cg surge como alternativa para facilitar la labor al programador.
El lenguaje suele consistir de dos tipos de programas completamente diferentes que interactúan entre sí. El primero es un programa de manipulación de vértices (modificar el modelo tridimensional) directamente desde la aceleradora, sin gastar recursos de la CPU principal. Por otra parte, la función del segundo tipo de programa es especificar el color de cada píxel en función de múltiples factores.
Algunas de las ventajas de usar Cg son:
Un lenguaje de alto nivel es más fácil de programar, aprender, leer y mantener
Puede funcionar en un amplio rango de hardware y plataformas (Es menos dependiente del hardware concreto y sus versiones que el lenguaje assembler)
El compilador de Cg puede optimizar el código en función de la versión de hardware concreta y otras características disponibles en el momento de ejecutar el programa.
Detalle
Perfiles
En el lenguaje utiliza la noción de perfiles (Cg Profiles) para facilitar la portabilidad. Cada uno de ellos establece capacidades mínimas y requisitos. De esta forma, un programador puede desarrollar un programa (o varias versiones) con la seguridad de que se ejecutará correctamente en aquellos sistemas que acepten ese perfil.
El establecimiento de los perfiles es una forma de asegurar la compatibilidad sin tener que implementar estrategias más complejas como la Compatibilidad hacia atrás.
Los Tipos de datos, operadores, funciones, estructuras, entre otros varían de acuerdo al perfil que se en el que se trabaje.
Tipos de datos
C for Graphics tiene seis tipos básicos de datos, algunos específicos para la programación de las GPU:
float - número de 32bit en coma flotante
half - número de 16bit en coma flotante
int - número de 32bit entero
fixed - número de 12bit en coma fija
bool - valor booleano
sampler* - un objeto de textura
También existen algunos tipos compuestos como vectores de 3 floats y matrices como 4x4 float.
Operadores
Cg soporta un conjunto limitado de operadores comparado con C/C++ sin embargo extiende algunos de ellos para realizar operaciones entre vectores.
Funciones
Cg admite crear funciones de manera similar que en C.
Control de flujo
Se admiten estructuras de control como bucles y control de flujo. En muchos casos, es condición necesaria que los ciclos sean desenrollables (para esto se debe conocer de antemano el número de veces que se ejecutará). Por otra parte, se pide que las secuencias de control estén limitadas en cuanto a niveles de anidamiento o bien que el predicado esté formado por variables globales a todo el programa (es decir dentro del programa se sepa ya si el predicado es cierto o falso).
La biblioteca estándar Cg
Esta biblioteca contiene muchas funciones útiles para la manipulación de números en coma flotante, vectores, matrices y texturas de tal forma que operaciones relativamente complejas (desde el punto de vista de un procesador) como el cálculo de la iluminación de un punto se resuelven con sólo unas pocas operaciones.
La biblioteca Cg de ejecución
Cg tiene un amplio repertorio de funciones para interactuar con el sistema Cg dentro de la biblioteca gráfica que se esté utilizando, esta sea DirectX u OpenGL.
Un ejemplo de Cg vertex shader
// input vertexstructVertIn{float4pos:POSITION;float4color:COLOR0;};// output vertexstructVertOut{float4pos:POSITION;float4color:COLOR0;};// vertex shader main entryVertOutmain(VertInIN,uniformfloat4x4modelViewProj){VertOutOUT;OUT.pos=mul(modelViewProj,IN.pos);// calculate output coordsOUT.color=IN.color;// copy input color to outputOUT.color.z=1.0f;// blue component of color = 1.0freturnOUT;}