C for Graphics

Cg/HLSL
C for GraphicsUma cena contendo diversos sombreadores 2D HLSL diferentes. Distorção da estátua é obtida puramente fisicamente, enquanto a textura da moldura retangular ao lado dela é baseada na intensidade da cor. O quadrado no fundo foi transformado e rotacionado. A transparência parcial e reflexão parcial da água no primeiro plano são adicionadas por um sombreador aplicado finalmente a toda a cena.
Criado por nVIDIA, Microsoft
Estilo de tipagem linguagem de sombreamento
Dialetos: Cg, HLSL, Playstation Shading Language
Influenciada por C, RenderMan Shading Language
Influenciou GLSL

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

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

Ver também

Referências

  1. Mark, William R.; Glanville, R. Steven; Akeley, Kurt; Kilgard, Mark J. (1 de julho de 2003). «Cg: a system for programming graphics hardware in a C-like language». San Diego, California: Association for Computing Machinery. SIGGRAPH '03: 896–907. ISBN 978-1-58113-709-5. doi:10.1145/1201775.882362. Consultado em 5 de dezembro de 2020 
  2. White, Steven; Coulter, David; Batchelor, Drew; Jacobs, Mike; Satran, Michael. «Writing HLSL Shaders in Direct3D 9 - Win32 apps». docs.microsoft.com (em inglês). Consultado em 5 de dezembro de 2020 
  3. «Cg FAQ». NVIDIA DesignWorks. 8 de março de 2011. Consultado em 25 de maio de 2017 
  4. «Cg Toolkit | NVIDIA Developer». 8 de março de 2011 

Bibliografia

Ligações externas