C for Graphics
C for Graphics (Cg), também conhecida como High-Level Shading Language (HLSL) é uma linguagem de programação desenvolvida pela Nvidia e Microsoft que é derivada do ANSI C para suporte ao design gráfico, aproveitando os recursos do hardware NVIDIA. Usada principalmente para o desenvolvimento de algoritmos para pixel shaders e vertex shaders que são instruções específicas para os GPUs das placas de vídeo.
Como resultado de avanços tecnológicos nas placas aceleradoras gráficas, algumas áreas de programação gráfica 3D tinham ficado muito complexas. Para simplificar o processo, novas características foram sendo adicionadas às placas, como capacidade de modificar suas as filas de renderizações através de utilização de vertex e pixel shaders. No começo, vertex e pixel shaders foram programados num nível muito básico, onde somente a linguagem assembly era utilizada para programação da GPU (Graphics Processing Unit). Apesar de ter o controle total da GPU o código em assembly era de difícil utilização. Uma linguagem portátil, e de maior nível de abstração era necessária, assim a Cg foi criada para facilitar o desenvolvimento de programas que utilizam esses avanços. Algumas vantagens da utilização da Cg sobre a linguagem assembly são: Maior nível de abstração do código facilita o aprendizado, a programação, a leitura e entendimento de códigos escritos.
Tipos de variáveis
Cg também possui tipos de dados de vetores e matrizes que são baseados nos tipos básicos de variáveis, como float3 e float4x4. Esses tipos de dados são bastante comuns quando lidando com programação gráfica 3D. Cg também tem tipos de dados de estruturas bastante similares ao disponíveis em C.
A biblioteca padrão Cg
Assim como em C, Cg tem um conjunto de funções comuns da programação gráfica. Algumas funções são equivalentes ao C, como funções matemáticas abs() e sin(), enquanto outras são especializadas nas tarefas para GPU, como as funções de mapeamento de texturas, como funções text1D e text2D.
A biblioteca de tempo de execução Cg
Programas em Cg são meramente vertex and pixel shaders. Eles precisam de suporte de outros programas para lidar com o resto do processo de renderização. Cg pode utilizar duas APIs: OpenGL ou DirectX. Cada uma tem seu próprio conjunto de funções para se comunicar com o programa em Cg, como funções para selecionar o shader corrente e passagem de parâmetros. A biblioteca padrão de tempo de execução permite que o código Cg seja codificado para assembly. Ele também permite compilar shaders durante a execução do programa que está sendo suportado. Isso permite que a biblioteca de tempo de execução compilar utilizando as últimas optimizações disponíveis para o hardware alvo. No entanto essa técnica permite que o usuário tenha acesso ao código fonte do shader, isso tem representado a grande desvantagem dessa técnica.


