C for Graphics

Cg/HLSL
C for Graphics
Uma 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[1] 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.[2][3] Cg foi descontinuado em 2012, sem desenvolvimento ou suporte adicional disponível.[4]

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.

Tipos de variáveis

[editar | editar código-fonte]
  • 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 | editar código-fonte]

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 | editar código-fonte]

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 | editar código-fonte]
 // 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

[editar | editar código-fonte]

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 

Ligações externas

[editar | editar código-fonte]