Limbaj Shader de nivel înalt

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
Limbaj Shader de nivel înalt
limbaj de programare
Autor Microsoft
Implementare referință
Site-ul web msdn.microsoft.com/

High Level Shader Language sau HLSL este un limbaj dezvoltat de Microsoft pentru crearea de shadere pentru utilizare în DirectX și este foarte similar cu limbajul Cg al NVIDIA .

HLSL vă permite să scrieți calcule grafice complexe care pot fi efectuate foarte rapid de GPU și reprezintă, de asemenea, primul pas într-o conductă grafică complet programabilă. Un limbaj analog, GLSL (OpenGL Shading Language), este prezent în bibliotecile grafice OpenGL .

Structura HLSL

HLSL s-a născut ca răspuns la nevoia de a scrie shadere mai repede decât cu limbajul asm .

Aceasta are o sintaxă C-Like , cu modificările și completările necesare.

Un exemplu de shader

 float4x4 matTotal: viziune asupra lumii;
float4x4 matWorld: lume;
Textura textului;
sampler TextSampler = sampler_state
{
 textura = <Text>;
 MIPFILTER = liniar;
 MAGFILTER = liniar;
 MINFILTER = liniar;
};
struct VS_OUT
{
 float4 Pos: POZIȚIE;
 float2 Tex: TEXCOORD0;
};
struct VS_IN
{
       float4 Pos: POZIȚIE;
       float2 Tex: TEXCOORD0;
};
VS_OUT vs_main (intrare VS_IN)
{
       Ieșire VS_OUT = (VS_OUT) 0;
       Output.Pos = mul (Input.Pos, matTotal);
       Output.Tex = Input.Tex;
       returnează ieșire;
}
struct PS_IN
{
       float2 Tex: TEXCOORD0;	
};
float4 ps_main (PS_IN Input): COLOR0
{
      returnează tex2D (TextSampler, Input.Tex);
}
Tehnica SimpleShader
{
       trece P0
       {
               VertexShader = compila vs_2_0 vs_main ();
               PixelShader = compilați ps_2_0 ps_main ();
       }
}

Acest simplu shader nu face altceva decât să plaseze un obiect și să-i aplice o textură.

Un shader în HLSL este alcătuit din tehnici , care la rândul lor sunt alcătuite din diferite treceri . În trecere, atunci specificați ce funcții urmează să fie utilizate și ce versiune a shader-ului.

Cum se folosește un shader

Încărcarea unui Shader

Direct3D9 are diferite moduri de a crea un shader. Practic, operațiunile de făcut sunt încărcarea shader-ului, introducerea valorilor pe care le cere (în cazul shader-ului de mai sus, are nevoie de matricea totală, de textura obiectului care trebuie redat și de matricea mondială.

În biblioteca D3DX există clasa ID3DXEffect care gestionează un shader. Fără această clasă, shadere ar trebui să fie gestionate de clasele IDirect3DVertexShader9 și IDirect3DPixelShader9

Pentru a încărca un shader puteți utiliza funcția D3DXCreateEffectFromFile care ia printre argumente un caracter * care indică numele fișierului .fx de încărcat.

Alternativ, puteți utiliza D3DXCompileShaderFromFile sau D3DXAssembleShaderFromFile , care compilează și asamblează un shader dintr-un fișier, creând o clasă Pixel sau Vertex Shader.

Introducerea valorilor necesare

Odată ce shader-ul este încărcat, trebuie să introduceți valorile dorite. Deși ID3DXEffect oferă diverse funcții de tip set ( SetTexture , SetMatrix , SetFloat ), de obicei folosim funcția SetValue care duce la un gol al indicatorului, numele valorii de introdus și dimensiunea valorii (care în orice caz este doar fictiv, este folosit doar pentru a face o comparație. De cele mai multe ori macro-ul D3DX_DEFAULT poate fi inserat pentru a evita verificarea dimensiunii și pentru a accelera setarea valorilor.)

Să presupunem că Shader este un indicator către ID3DXEffect și matTotale o matrice de proiecție totală (adică produsul matricei lumii, vizualizării și proiecției)

 Shader-> SetValue ("matTotal", & matTotale, sizeof (D3DXMATRIX);
Shader-> CommitChanges ();

Odată introduse diferitele valori, trebuie apelată funcția CommitChanges () pentru a actualiza shader-ul .

Folosirea shaderului în redare

În funcția de redare, va trebui să utilizați nuanța pentru a putea vedea rezultatele, așa.

Să presupunem că Shader este indicatorul către clasa Shader, iar Mesh este un indicator către o clasă de mesh generică.

 Shader-> Begin (0, NULL); // Pregătiți nuanța pentru redare
 Shader-> BeginPass (0); // Selectați trecerea de executat (P0)
  Shader-> SetTexture ("text", Mesh-> Texture); // Introduceți textura. De asemenea, puteți utiliza setvalue
  Shader-> CommitChanges (); // Actualizați shader-ul cu rezultatele
   Mesh-> DrawSubset (i); // Desenați plasă
 Shader-> EndPass (); // sfârșitul permisului
Shader-> End (); // sfârșitul umbrei.

Versiuni ale HLSL

Limbajul HLSL a evoluat în timp, ajungând la 4 versiuni principale și variate minore. Diferența dintre versiuni este în esență limita maximă a instrucțiunilor, plus o serie de adăugiri importante.

Elemente conexe

linkuri externe