C for Graphics
C for Graphics (Cg) é uma linguagem de programação da NVIDIA 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 video.
Índice |
Fundamentos [editar]
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 [editar]
Tipos de variáveis [editar]
- 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 [editar]
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 [editar]
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 [editar]
// 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 [editar]
- Crystal Space
- Far Cry
- OGRE
- Unity game engine
- Virtools Dev
- Enemy Territory: Quake Wars
Leitura para Aprofundamento [editar]
- 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 [editar]
- Cg in Two Pages (em inglês)
- NVIDIA (em inglês)
- (em inglês) Cg FAQ
- (em inglês) Cg home page
- (em inglês) Developer Forums
- OpenGL home page (em inglês)
- DirectX home page (em inglês)
- ShaderTech - GPU Programming (em inglês)
- NeHe Cg vertex shader tutorial (em inglês)
- Far Cry (em inglês)
- A glimpse at Cg Shader Toolkit (em inglês)