A HLSL ( High Level Shader Language ) egy magas szintű C -szerű nyelv a shader programozáshoz .
A Microsoft készítette, és a DirectX 9.0 csomag tartalmazza.
A HLSL támogatja a skaláris típusokat, vektortípusokat, mátrixokat és struktúrákat.
Példa: vektor <lebegő, 4> szín;
Példa: float4 newcolor;
Példa: float oldcolor[4]
Példa: újszín = float4(oldcolor[0], oldcolor[1], oldcolor[2], oldcolor[3])
Példa: mátrix <float, 4> view_matrix;
Példa: float 4x4 view_matrix;
struct vs_input {
float4 poz:POSITION; float3 nor:NORMAL; float2uv:TEXCOORD0;}; struct ps_input {
float4 poz:POSITION; float3 nor:NORMAL; float2uv:TEXCOORD0; float CustomVar; texture2D CustomTexture; //és így tovább... :POSITION :NORMÁL stb szentitikusok, róluk lentebb.};
Tevékenységek | Üzemeltetők |
---|---|
Számtan | -, +, *, /, % |
növekedés, csökkenés | ++, -- |
összerakós játékaik | \|, ?: |
Unary | !, -, + |
Összehasonlítások | <, >, <=, >=, ==, != |
Célja | =, -=, +=, *=, /= |
Öntvény | (típusú) |
Vessző | , |
Szerkezet tagja | . |
Tömbtag | [index] |
if (kifejezés) <állítás> [ else <állítás>]
A HLSL-ben háromféle hurok létezik:
abs(x) | minden x komponens abszolút értékét adja vissza |
acos(x) | minden x komponens arc koszinuszát adja vissza. Minden összetevőnek a [-1, 1] tartományban kell lennie |
asin(x) | minden x komponens arcszinuszát adja vissza. Minden összetevőnek a [-pi/2, pi/2] tartományban kell lennie |
atan(x) | minden x komponens arctangensét adja vissza. Minden összetevőnek a [-pi/2, pi/2] tartományban kell lennie |
ceil(x) | a legkisebb egész számot adja vissza, amely nagyobb vagy egyenlő, mint x (felfelé kerekítés) |
cos(x) | visszaadja x koszinuszát |
készpénz(x) | visszaadja x hiperbolikus koszinuszát |
bilincs(x, a, b) | Ha x < a, akkor a, ha x > b, akkor b, egyébként x. |
ddx(x) | az x parciális deriváltját adja vissza a képernyőtér x-koordinátájához képest |
ddy(x) | az x parciális deriváltját adja vissza az y képernyőtér-koordinátához képest |
fok(x) | Átalakítsa x-et radiánból fokokra |
távolság (a, b) | két a és b pont távolságát adja vissza |
pont(a,b) | két a és b vektor pontszorzatát adja vissza |
exp(x) | a kitevőt e vagy e x bázissal adja vissza |
emelet (x) | a legnagyobb egész számot adja vissza, amely kisebb vagy egyenlő, mint x (lefelé kerekítés) |
frac( x ) | x tört részét adja vissza. |
fwidth(x) | abs(ddx(x))+abs(ddy(x)) |
len(v) | Vektor hossza |
hossz (v) | visszaadja a v vektor hosszát |
lerp(a, b, s) | visszaadja a + s (b - a) |
log(x) | x logaritmusát adja vissza |
log10(x) | x decimális logaritmusát adja vissza |
modf(x, out ip) | visszatér x tört és egész részéhez, mindegyik résznek ugyanaz az előjele, mint x |
mul(a, b) | mátrixszorzást végez a és b között |
normalizál(v) | normalizált v vektort ad vissza |
pow(x, y) | x y-t adja vissza |
radián(x) | konvertálja át x-et fokokról radiánra |
tükröz(i, n) | visszaadja a reflexiós vektort |
törés(i, n, eta) | visszaadja a törésvektort. |
kerek ( x ) | a legközelebbi egész számot adja vissza. |
rsqrt(x) | 1 / sqrt(x) |
telített (x) | Ugyanaz, mint a bilincs(x,0,1) |
bűn(x) | x szinuszát adja vissza. |
sincos(x, out s, out c) | x szinuszát és koszinuszát adja vissza |
sinh(x) | x hiperbolikus szinuszát adja vissza |
sqrt(x) | minden komponens négyzetgyökét adja vissza |
lépés (a, x) | 1-et ad vissza, ha x >= a, ellenkező esetben 0-t ad vissza |
barna(x) | x érintőjét adja vissza |
tanh(x) | x hiperbolikus tangensét adja vissza |
tex1D(s, t) | Leolvasás egydimenziós textúrából s - sampler, t - skalár. |
tex1D(s, t, ddx, ddy) | Leolvasás egydimenziós textúrából, ahol a derivált s mintavevő, t, ddx és ddy skalár. |
tex1Dproj(ok, t) | Egydimenziós projektív textúra olvasása s - sampler, t - 4D vektor. t elosztjuk tw-vel a függvény végrehajtása előtt. |
tex1Dbias(s, t) | Eltolású egydimenziós textúrából leolvasva s mintavevő, t 4 dimenziós vektor. A mip szint tw-vel eltolódik a keresés előtt. |
tex2D(ek, t) | 2D textúrából olvasás s mintavevő, t 2D vektor. |
tex2D(s, t, ddx, ddy) | Olvasás 2D textúrából származékokkal. s - mintavevő, t - 2D textúra koordináták. ddx, ddy- 2D vektorok. |
tex2Dproj(ok, t) | 2D projektív textúra olvasása. s - mintavevő, t - 4D vektor. t elosztjuk tw-vel a függvény végrehajtása előtt. |
tex2Dbias(ok, t) | Olvasás 2D-s textúrából eltolással. s mintavevő, t 4-dimenziós vektor. A mip szint tw-vel eltolódik a keresés előtt. |
tex3D(ek, t) | 3D-s textúra olvasása. s - mintavevő, t - 3D vektor. |
tex3D(s, t, ddx, ddy) | 3D-s textúra olvasása származékokkal. s - mintavevő, t - 2D textúra koordináták, ddx, ddy - 3D vektorok. |
tex3Dproj(ok, t) | 3D-s projektív textúra olvasása. s - mintavevő, t - 4D vektor. t elosztjuk tw-vel a függvény végrehajtása előtt. |
tex3Dbias(ok, t) | 3D-s textúra olvasása eltolással. s mintavevő, t 4-dimenziós vektor. A mip szint tw-vel eltolódik a keresés előtt. |
texCUBE(s, t) | Olvasás egy kocka textúrájából. s - mintavevő, t - 3D textúra koordináták. |
texCUBE(s, t, ddx, ddy) | Olvasás egy kocka textúrájából. s - mintavevő, t - 3D textúra koordináták, ddx, ddy - 3D vektorok. |
texCUBEproj(ok, t) | Felolvasás egy köbös projektív textúrából. s - mintavevő, t - 4D vektor. t elosztjuk tw-vel a függvény végrehajtása előtt. |
texCUBEbias(ok, t) | Olvasás egy kocka textúrájából. mintavevő, t egy 4D vektor. A mip szint tw-vel eltolódik a keresés előtt. |
A Vertex és a fragment shadereknek két bemeneti típusa van: változó és egységes .
Egységes – állandó adat a shaderben való többszöri felhasználáshoz. Az egységes adatok HLSL-ben deklarálása kétféleképpen történhet:
1) Deklarálja az adatokat külső változóként. Például:
float4 érték; float4 main() : SZÍN { visszatérési érték; }2) Adja meg az adatokat az egységes minősítőn keresztül. Például:
float4 main (uniform float4 érték) : COLOR { visszatérési érték; }Az egységes változókat egy konstans táblázat adja meg. A konstans tábla tartalmazza az összes regisztert, amelyet a shader folyamatosan használ.
A változó az egyes shaderhívásokhoz egyedi adatok. Például: pozíció, normál stb. A vertex shaderben ez a szemantika leírja a vertex pufferből átadott változó adatokat, a fragment shaderben pedig a vertex shadertől kapott interpolált adatokat.
Fő bejövő szemantikai típusok:
BINORMÁLIS | Binormális |
---|---|
BLENDWEIGHT | Súlyegyüttható |
BENDINDICES | Súlymátrix index |
SZÍN | Szín |
NORMÁL | Normál |
POZÍCIÓ | Pozíció |
MÉRET | Pont mérete |
TANGENS | Tangens |
TESSFACTOR | Tesselációs tényező |
TEXCOORD | Textúra koordináták |
Változó adatok használata a töredék árnyékolóban meghatározza egyetlen töredék állapotát. Fő bejövő szemantikai típusok:
SZÍN | Szín |
---|---|
TEXCOORD | Textúra koordináták |
A vertex shader kimenő adatai:
POZÍCIÓ | Pozíció |
---|---|
MÉRET | Pont mérete |
KÖD | Ködtényező a csúcshoz |
SZÍN | Szín |
TEXCOORD | Textúra koordináták |
Kimenő adatok a töredék árnyékolóhoz:
SZÍN | Szín |
---|---|
MÉLYSÉG | Mélység érték |
A shader írásának megkönnyítésére számos program létezik, amelyek lehetővé teszik shader összeállítását és az eredmény azonnali megtekintését.
A pixel shadereket rendererek is használják, pl.
A listában szereplő kód az ATI Rendermonkey-ban és az Nvidia FX composerben működik. Egyéni motorban való használatához meg kell adnia a SamplerState-ot és a technikát.
/* ========== VERTEX SHADER ========== */ /* world_matrix, view_matrix, proj_matrix az alkalmazásból a shader állandók beállításával kell beszerezni. A Shader állandók regiszterekbe kerülnek. */ float4x4 world_matrix ; // világmátrix float4x4 view_matrix ; // mátrix, mint a float4x4 proj_matrix ; // vetítési mátrix struct VS_OUTPUT // ennek a struktúrának egy példánya egy vertex shader-t ad vissza { float4 Pos : POSITION0 ; /* A POSITION0 és a TEXCOORD0 szemantika, amely azokat a réseket jelöli, ahonnan a pixel shader később adatokat fog kapni. Az itt megadott szemantikának meg kell egyeznie a bemenetben lévő szemantikával a pixel shaderrel. A változók nevei és sorrendje változhat.*/ float2 TexCoord : TEXCOORD0 ; }; VS_OUTPUT VS_Main ( float4 InPos : POSITION0 , float2 InTexCoord : TEXCOORD0 ) /* A vertex shader a kimeneti objektum minden csúcsára lefut. Az adatfolyam-leképezési adatokból nyert InPos és InTexCoord */ { VS_OUTPUT Out ; float4x4 worldViewProj_matrix = mul ( world_matrix , view_matrix ); worldViewProj_matrix = mul ( worldViewProj_matrix , proj_matrix ); ki . Pos = mul ( InPos , worldViewProj_matrix ); // vertex átalakítása clip-space Out -ra . TexCoord = InTexCoord ; // textúra koordinátákat kívülről kapunk, semmit nem kell módosítani return Out ; } /* ========== PIXEL SHADER ========== */ sampler2D baseMap ; // A sampler2D egy speciális "textúra hely", amelybe textúrát lehet betölteni. float4 PS_Main ( float2 texCoord : TEXCOORD0 ) : COLOR0 /* A pixel shader mindig COLOR0 szemantikával adja vissza a renderelt pixel színét float4 formátumban. A pixel shader a renderelt kép minden pixelére lefut (nem minden textúra texelre) */ { return tex2D ( baseMap , texCoord ); /* tex2d(sampler2D, float2) kiolvassa a textúra mintavevőből (a textúrából) a texelének színét a megadott textúra koordinátákkal. Ez lesz a kimeneti pixel színe. */ }