C for Graphics
Cg/HLSL | |
---|---|
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]
Fundamentos
[editar | editar código-fonte]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 | editar código-fonte]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]- Crystal Space
- Far Cry
- OGRE
- Unity game engine
- Virtools Dev
- Enemy Territory: Quake Wars
Ver também
[editar | editar código-fonte]Referências
- ↑ 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
- ↑ 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
- ↑ «Cg FAQ». NVIDIA DesignWorks. 8 de março de 2011. Consultado em 25 de maio de 2017
- ↑ «Cg Toolkit | NVIDIA Developer». 8 de março de 2011
Bibliografia
[editar | editar código-fonte]- 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 | editar código-fonte]- «Cg in Two Pages» (PDF) (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)