Curso completo de DirectX 9 com C\C++
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 10-1
10.1 O que é HLSL?
1.1 Visão geral
* Amostras de exemplo produzidas no software RenderMonkey da AMD com hlsl:

Em resumo, HLSL é uma linguagem de programação com comunicação direta
com a placa de aceleração de vídeo. A linguagem tem dois propósitos
principais que consistem em habilitar o acesso a transformação final
dos vértices e o acesso na composição da cor final do pixel através
de um programa escrito que o DirectX transfere para a placa de
video executar.
HLSL é uma abreviação para High Level Shader Language que pode ser
traduzido como linguagem de programação de shader de alto nível. O
alto nível é por conta da linguagem trazer os padrões da linguagem C
em contraste com sua outra versão expressada em linguagem assembly.
A linguagem de programação de shaders é uma das grandes revoluções da
computação gráfica e surgiu inicialmente dentro do ambiente do desenho
animado cinematográfico. Foi criada pela Pixar que produziu Toy Story
e dezenas de outros filmes animados. Hoje a produção dos melhores
videogames ou a produção dos melhores efeitos especiais do cinema
não ocorre mais sem a presença do shader programado. HLSL é padrão da
Microsoft e a linguagem original da Pixar chama-se Renderman Shader
Language.
O surgimento do HLSL dividiu o modelo de produção gráfica em duas
linhas de produção distintas:a linha de funções fixas (fixed-function
pipeline no inglês da Microsoft) e a linha programável (programmable
pipeline). A linha de funções fixas é o modelo mais antigo aonde
cada recurso que a placa de vídeo oferece é traduzida por uma função
fixa criada para explorá-lo. A linha de funções fixas coloca entre o
programador e a placa de video uma complicada API gráfica, o
DirectX aqui no caso. A linha programável permite o contato direto
com a placa de vídeo, dando ao programador mais poder, mais
performance, mais liberdade criativa e produtiva, e também reduz o
fardo da complexidade do DirectX. É muito mais simples e muito mais
fácil produzir as coisas com HLSL dentro da placa da vídeo do que
utilizar código DirectX similar.
A estrutura interna da placa de video e o conjunto de funções
produzidas que modificam a posição final dos vértices é chamado de
VertexShader; a estrutura interna com o conjunto de funções que
modificam a composição da cor final do pixel é chamado de PixelShader.
O modelo de shader é composto então pelo pixelshader e vertexshader
que surgiu inicialmente na versão 1.0 com o DirectX 8. O DirectX 9
suporta o modelo 3.0 e o modelo mais atual é o 5.0 presente no DirectX
11. Nossa aplicação foi escrita utilizando o modelo 1.1.
No subtópico abaixo é exibido o primeiro programa em hlsl com o qual
você vai travar contato nesse curso apenas para você perceber o
quanto o programa tem semelhança com um programa escrito na
linguagem C++.
1.2 O primeiro programa em HLSL

// Gameprog: Introdução a programação em HLSL
// Arquivo: simples.fx - prj_HSL01
// Matriz de projeção e visualização
float4x4 Camera : WORLDVIEWPROJECTION;
float nMovimento;
// Transforma coordenadas 3d em espaço de tela
float4 vs_Main( float4 Pos : POSITION) : POSITION
{
// Declara variável de saída
float4 saida_pos;
// Transforma posição
Pos.z += nMovimento * 2;
saida_pos = mul(Pos, Camera);
// Retorna posição transformada
return saida_pos;
} // vs_Main().fim
float4 ps_Main ( ) : COLOR0
{
// Declara uma variável para cor no padrão RGBA
float4 cor = float4 (0.0f, 0.0f, 0.0f, 0.0f);
// Configura individualmente os canais de cor
cor.r = nMovimento;
cor.b = 1 - nMovimento;
cor.ga = 1.0f;
return cor;
} // ps_Main().fim
technique MovimentoCor
{
pass P0
{
// Configura alguns estados do dispositivo
CullMode = None;
FillMode = Solid;
// Compila o VertexShader e o PixelShader
VertexShader = compile vs_1_1 vs_Main();
PixelShader = compile ps_1_1 ps_Main();
} // fim do passo P0
} // fim da técnica