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.
Existem dois ramos principais da linguagem Cg / HLSL: o compilador Nvidia Cg (cgc) que retorna DirectX ou OpenGL e o Microsoft HLSL que retorna sombreadores DirectX em formato bytecode. Cg foi descontinuado em 2012, sem desenvolvimento ou suporte adicional disponível.
Fundamentos 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.
O Código Cg é portátil para uma grande gama de hardware e diversas plataformas, diferente do código assembly que depende do hardware e plataforma. O compilador Cg pode ser optimizado e criar tarefas automaticamente que seriam difícieis de se codificar e mais livres de erros.
Cg tem seis tipos básicos de variáveis, algumas as mesmas de C, outras especiais para sua utilização.
Detalhes Tipos de variáveis float - número de ponto flutuante de 32 bits half - número de ponto flutuante de 16 bits int - número inteiro de 32 bits fixed - número de ponto fixo de 12 bits bool - variável booleana sampler* - representa um objeto de textura 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.
Para evitar expor o código fonte do shader, e ainda manter as últimas optimizações para o hardware específico, o conceito de profiles foi desenvolvido. Shaders podem ser compilados com conjuntos de diferentes plataforma de hardware (de acordo com o profile). Quando executando o programa, o mais optimizado shader é carregado de acordo com o profile. Por exemplo, pode existir um profile que dá suporte para que placa gráfica aceleradora possa utilizar pixel shaders complexos, e outro profile que suporta somente pixel shaders mínimos. Criando um pixel shader para cada um desses profiles o programa amplia o número de plataformas sem sacrificar a qualidade gráfica de sistemas mais potentes.
Um exemplo de programa Cg vertex shader // input vertex struct VertIn { float4 pos : POSITION; float4 color : COLOR0;
// output vertex struct VertOut { float4 pos : POSITION; float4 color : COLOR0;
// vertex shader main entry VertOut main(VertIn IN, uniform float4x4 modelViewProj) { VertOut OUT; OUT.pos = mul(modelViewProj, IN.pos); // calculate output coords OUT.color = IN.color; // copy input color to output OUT.color.z = 1.0f; // blue component of color = 1.0f return OUT;
Aplicações e jogos que utilizam Cg ou HLSL Crystal Space Far Cry OGRE Unity game engine Virtools Dev Enemy Territory: Quake Wars
Ver também
Programação de computadores Computação gráfica Sombreador OpenGL Shading Language OpenGL DirectX
Bibliografia Randima Fernando, Mark J. Kilgard, The Cg Tutorial: The Definitive Guide to Programmable Real-Time Graphics, Addison-Wesley Professional, ISBN 0-321-19496-9 Randima Fernando, GPU Gems: Programming Techniques, Tips, and Tricks for Real-Time Graphics , A ddison-Wesley Professional, ISBN 0-321-22832-4 William R. Mark, R. Steven Glanville, Kurt Akeley, Mark J. Kilgard, Cg: A System for Programming Graphics Hardware in a C-like Language, Proceedings of SIGGRAPH 2003. Mark J. Kilgard , Cg in Two Pages, 2003.
Ligações externas
Cg FAQ Cg home page Developer Forums
Categoria:Linguagens de programação Categoria:Nvidia