Shaders

Introdução

 

Efeitos que podem ser criados com shaders:

·       Cabelo e pelo

·       Iluminação por pixel

·       Efeitos de água

·       Roupas

·       Um efeito à escolha

 

O porghramador cria os shaders em código assembly ou na nova anunciada linguagem Cg (extremamente parecida com código em C).

Uma desvantagem dos shaders é que as placas gráficas mais antigas não os suportam pois não contém processadores gráficos programáveis.

 

Vertex shader

 

Uma definição para um vertex shader é:

Um vertex shader é uma função de processamento gráfico, que manipula valores de vértices num plano X (comprimento), Y (altura) e Z (profundidade) através de operações matemáticas num objecto. Estas variações variam desde diferenças na cor, coordenadas de texturas, orientação no espaço, densidade e tamanho de ponto.

 

 

Quando um vertex shader está activado, substitui as funções fixas do pipeline por vértices. O vertex shader não opera numa primitiva como um triângulo, mas num único vértice. Por cada vértice a ser processado, o prohrama de Vertex Shader é executado.

 

Pipeline dos Vertex Shaders

O diagrama seguinte mostra os níveis de operação Fonte, Vertex(Vértices) e Pixel no pipeline de Direct3D numa forma simplificada:

 

No nível de fonte, os vértices recebidos são agrupados e padronizados. Este é o módulo mais primitivo, que trabalha para padronizar primitivas de alta ordem, como N-Patches (http:/www.visionengineer.com/comp/n_patches.shtml), curvas de Bézier (http://gmunch.home.pipeline.com/typo-L/articles/Whitlock/Whitlock5.htm) e B-splines (http://www.cse.unsw.edu.au/~lambert/splines/Bspline.html).

O próximo estágio no pipeline cobre as operações sobre Vértices. Existem duas maneiras diferentes de processar vértices:

  1. O pipeline de função fixa. Este é o pipeline standard da tecnologia Transform & Lightning (T&L), onde as funcionalidades são essencialmente estáticas. Este pipeline pode ser controlado modificando os estados de renderização (http://renderingguru.port5.com/),matrizes, e parâmetros de iluminação e  material.
  2. Vertex Shaders. Este é o novo mecanismo introduzido com o DirectX 8. Em vez de alterar os parâmetros do pipeline, escreve-se um programa de vertex shader que é executado no hardware gráfico.

È óbvio por este giagrama simplificado que os estágios seguintes a Face Culling (inclusivé) operam em estádios após o vertex shader, sendo por isso estáticos e não podendo pela mesma razão serem controlados pelo vertex shader. Este também não é capaz de escrever para um outro vertex shader (são programas). Também não é capaz de criar vértices, gera apenas um vértice de output por cada vértice de input que recebe.

T&L (Transform & Lightning)

Mundos geometricamente complexos requerem velocidade de processamento excepcional. E transformações e iluminação são processos matematicamente intensos

Arquitectura de um Vertex Shader

Vamos analisar mais profundamente a programação de vertex shaders olhando para a representação gráfica da arquitectura de um vertex shader:


 

Todos os dados num vertex shader são representados por floats quádruplos de 128 bits (4x32):


Um vertex shader por hardware pode ser visto como um típico processador SIMD (Single Instruction Multiple Data), pois em cada instrução afectam-se 4 variáveis de 32 bits. Este tipo de daos é extremamente útil, pois a maior parte as transformações e cálculos e iluminação são feitos usando matrizes 4x4. As instruções são são muito simples e fáceis de compreender, pois o vertex shader não permite nenhuns ciclos, saltos ou saltos condicionais, cada programa é executado linearmente, uma instrução a seguir à outra. Combinar vertex shaders para que um processe a transformação e o seguinte processe a iluminação é impossível.

Um vertex shader pode usar até 16 registos de input  (v0-v15 cada um com 128 bits (4x32)) para aceder a dados de input sobre vértices. Cada registo de input guarda o dados normais de um vértice: as suas coordenadas de posição, cor normal, difusa e especular, coordenadas de nevoeiro e tamanho do ponto com espaço para coordenadas de diversas texturas.

Os registos de constantes (c0-c95) são importados pelo CPU, antes do vertex shader começar a executar parâmetros definidos pelo programador. O vertex shader não pode escrevrnos registos de constantes. Eles são usados para guardar parâmetros como a posição da luz, matrizes, data procedimental para animações especiais, dados de interpolação de vértices para interpolação de frames chave e outros.

Os registos temporários consistem de 12 registos usados para cálculos intermédios. Podem ser usados para importar e guardar dados (read/write). Os seus nomes vão de r0 a r11.

Existem finalmente 9 registos de output (Vertex Output), o0 a o9. O programa de vertex shader tem apenas acesso write-only a estes registos. Aqui está um quadro informativo sobre os registos:

Registers:

Number of Registers

Properties

Input (v0 - v15)

16

RO1

Output (o*)

GeForce 3/4TI: 9; RADEON 8500: 11

WO

Constants (c0 - c95)

vs.1.1 Specification: 96; RADEON 8500: 192

RO1

Temporary (r0 - r11)

12

R1W3

Address (a0.x)

1 (vs.1.1 and higher)

WO (W: only with mov)

 

Pixel shader

Quando se cria um pixel shader, cria-se uma função utilizada para processar pixel’s. Com pixel shaders podem-se criar interações de água ou mapas detalhados. 

É frequentemente pixel shaders requerem dados do Vertex Shader.  Pixel shaders têm frequentemente que ser dirigidos pelo vertex shader. Por exemplo, para calcular pixel’s iluminados, pixel shader precisa da orientação do triângulo, a orientação do vector de luz e em alguns casos a orientação do vector de visão.