# C for Graphics

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
## Aplicações e jogos que utilizam Cg ou HLSL

* Crystal Space
* Far Cry
* OGRE
* Unity game engine
* Virtools Dev
* Enemy Territory: Quake Wars