HLSL ( High Level Shader Language ) je jazyk podobný C na vysoké úrovni pro programování shaderů .
Byl vytvořen společností Microsoft a je součástí balíčku DirectX 9.0.
HLSL podporuje skalární typy, vektorové typy, matice a struktury.
Příklad: vector <float, 4> color;
Příklad: float4 newcolor;
Příklad: float oldcolor[4]
Příklad: newcolor = float4(oldcolor[0], oldcolor[1], oldcolor[2], oldcolor[3])
Příklad: matrix <float, 4> view_matrix;
Příklad: float 4x4 view_matrix;
struct vs_input {
float4 pos:POSITION; float3 nor:NORMAL; float2uv:TEXCOORD0;}; struct ps_input {
float4 pos:POSITION; float3 nor:NORMAL; float2uv:TEXCOORD0; plovoucí CustomVar; texture2D CustomTexture; //a tak dále... :POSITION :NORMAL atd. jsou sentimatici, více o nich níže.};
Operace | Operátoři |
---|---|
Aritmetický | -, +, *, /, % |
zvýšit, snížit | ++, -- |
hlavolam | \|, ?: |
unární | !, -, + |
Srovnání | <, >, <=, >=, ==, != |
Účel | =, -=, +=, *=, /= |
Obsazení | (Typ) |
Čárka | , |
Člen struktury | . |
Člen pole | [index] |
if (výraz) <příkaz> [ jinak <výrok>]
V HLSL jsou 3 typy smyček:
abs(x) | vrátí absolutní hodnotu každé složky x |
acos(x) | vrátí arkus cosinus každé složky x. Každá složka musí být v rozsahu [-1, 1] |
asin(x) | vrátí arkussinus každé složky x. Každá komponenta musí být v rozsahu [-pi/2, pi/2] |
atan(x) | vrátí arkus tangens každé složky x. Každá komponenta musí být v rozsahu [-pi/2, pi/2] |
strop (x) | vrátí nejmenší celé číslo, které je větší nebo rovno x (zaokrouhleno nahoru) |
cos(x) | vrátí kosinus x |
hotovost (x) | vrátí hyperbolický kosinus x |
svorka (x, a, b) | Pokud x < a, vrátí a, pokud x > b, vrátí b, jinak vrátí x. |
ddx(x) | vrátí parciální derivaci x vzhledem k souřadnici x prostoru obrazovky |
ddy(x) | vrátí parciální derivaci x vzhledem k y-ové souřadnici obrazovkového prostoru |
stupně (x) | Převeďte x z radiánů na stupně |
vzdálenost (a, b) | vrátí vzdálenost mezi dvěma body a a b |
tečka (a,b) | vrací bodový součin dvou vektorů a a b |
exp(x) | vrátí exponent se základem e nebo e x |
patro (x) | vrátí největší celé číslo, které je menší nebo rovno x (zaokrouhleno dolů) |
frac( x ) | vrátí zlomkovou část x. |
šířka (x) | vrátí abs(ddx(x))+abs(ddy(x)) |
len(v) | Délka vektoru |
délka (v) | vrátí délku vektoru v |
lerp(a, b, s) | vrátí a + s (b - a) |
log(x) | vrátí logaritmus x |
log10(x) | vrátí dekadický logaritmus x |
modf(x, out ip) | vrátí se na zlomkovou a celočíselnou část x, každá část má stejné znaménko jako x |
mul(a, b) | provádí násobení matic mezi a a b |
normalizovat (v) | vrací normalizovaný vektor v |
pow(x, y) | vrátí x y |
radiány (x) | převést x ze stupňů na radiány |
odrážet (i, n) | vrátí vektor odrazu |
lámat (i, n, eta) | vrací vektor lomu. |
kolo ( x ) | vrátí nejbližší celé číslo. |
rsqrt(x) | vrátí 1 / sqrt(x) |
nasytit (x) | Stejné jako svorka (x,0,1) |
hřích(x) | vrátí sinus x. |
sincos(x, ven s, ven c) | vrátí sinus a kosinus x |
sinh(x) | vrací hyperbolický sinus x |
sqrt(x) | vrátí druhou odmocninu každé komponenty |
krok (a, x) | vrátí 1, pokud x >= a, jinak vrátí 0 |
tan(x) | vrátí tangens x |
tanh(x) | vrátí hyperbolický tangens x |
tex1D(s, t) | Čtení z jednorozměrné textury s - sampler, t - skalární. |
tex1D(s, t, ddx, ddy) | Čtení z jednorozměrné textury, přičemž deriváty s jsou sampler, t, ddx a ddy jsou skaláry. |
tex1Dproj(s, t) | Čtení z jednorozměrné projektivní textury s - sampler, t - 4D vektor. t je před provedením funkce děleno tw. |
tex1Dbias(s, t) | Čtení z jednorozměrné textury s offsetem, s je vzorník, t je 4rozměrný vektor. Úroveň mip se před provedením vyhledávání posune o tw. |
tex2D(s, t) | Čtení z 2D textury s je sampler, t je 2D vektor. |
tex2D(s, t, ddx, ddy) | Čtení z 2D textury s deriváty. s - sampler, t - souřadnice 2D textury. ddx, ddy- 2D vektory. |
tex2Dproj(s, t) | Čtení z 2D projektivní textury. s - vzorkovač, t - 4D vektor. t je před provedením funkce děleno tw. |
tex2Dbias(s, t) | Čtení z 2D textury s offsetem. s je vzorník, t je 4-rozměrný vektor. Úroveň mip se před provedením vyhledávání posune o tw. |
tex3D(s, t) | Čtení z 3D textury. s - vzorkovač, t - 3D vektor. |
tex3D(s, t, ddx, ddy) | Čtení z 3D textury s deriváty. s - sampler, t - souřadnice 2D textur, ddx, ddy - 3D vektory. |
tex3Dproj(s, t) | Čtení z 3D projektivní textury. s - vzorkovač, t - 4D vektor. t je před provedením funkce děleno tw. |
tex3Dbias(s, t) | Čtení z 3D textury s offsetem. s je vzorník, t je 4-rozměrný vektor. Úroveň mip se před provedením vyhledávání posune o tw. |
texCUBE(s, t) | Čtení z textury krychle. s - sampler, t - souřadnice 3D textury. |
texCUBE(s, t, ddx, ddy) | Čtení z textury krychle. s - sampler, t - souřadnice 3D textur, ddx, ddy - 3D vektory. |
texCUBEproj(s, t) | Čtení z kubické projektivní textury. s - vzorkovač, t - 4D vektor. t je před provedením funkce děleno tw. |
texCUBEbias(s, t) | Čtení z textury krychle. sampler, t je 4D vektor. Úroveň mip se před provedením vyhledávání posune o tw. |
Vertexové a fragmentové shadery mají dva typy vstupu: různé a jednotné .
Uniform - data, která jsou konstantní pro vícenásobné použití v shaderu. Deklaraci jednotných dat v HLSL lze provést dvěma způsoby:
1) Deklarujte data jako externí proměnnou. Například:
hodnota float4; float4 main() : COLOR { návratová hodnota; }2) Deklarujte data prostřednictvím jednotného kvalifikátoru. Například:
float4 main (jednotná hodnota float4): COLOR { návratová hodnota; }Jednotné proměnné jsou specifikovány pomocí tabulky konstant. Tabulka konstant obsahuje všechny registry, které se v shaderu neustále používají.
Liší se data, která jsou jedinečná pro každé volání shaderu. Například: position, normal, atd. Ve vertex shaderu tato sémantika popisuje různá data, která jsou předána z vertex bufferu, a ve fragment shaderu interpolovaná data přijatá z vertex shaderu.
Hlavní příchozí sémantické typy:
BINORMÁLNÍ | Binormální |
---|---|
BLENDWEIGHT | Hmotnostní koeficient |
BLENDINDICES | Hmotnostní maticový index |
BARVA | Barva |
NORMÁLNÍ | Normální |
POZICE | Pozice |
PSIZE | Velikost bodu |
TEČNA | Tečna |
TESSFACTOR | Teselační faktor |
TEXCOORD | Souřadnice textury |
Použití různých dat v shaderu fragmentu určuje stav jednoho fragmentu. Hlavní příchozí sémantické typy:
BARVA | Barva |
---|---|
TEXCOORD | Souřadnice textury |
Odchozí data pro vertex shader:
POZICE | Pozice |
---|---|
PSIZE | Velikost bodu |
MLHA | Faktor mlhoviny pro vrchol |
BARVA | Barva |
TEXCOORD | Souřadnice textury |
Odchozí data pro fragment shader:
BARVA | Barva |
---|---|
HLOUBKA | Hodnota hloubky |
Pro usnadnění psaní shaderů existuje řada programů, které umožňují skládání shaderů a okamžité zobrazení výsledku.
Pixel shadery používají také renderery, např.
Kód v tomto seznamu funguje ve skladateli ATI Rendermonkey a Nvidia FX. Chcete-li jej použít ve vlastním enginu, musíte zadat SamplerState a techniku.
/* ========== VERTEX SHADER ========== */ /* world_matrix, view_matrix, proj_matrix je nutné získat z aplikace nastavením shaderových konstant. Shaderové konstanty se načítají do registrů. */ float4x4 world_matrix ; // matice světa float4x4 view_matrix ; // matice jako float4x4 proj_matrix ; // projekční matice struct VS_OUTPUT // instance této struktury vrátí vertex shader { float4 Pos : POSITION0 ; /* POSITION0 a TEXCOORD0 jsou sémantiky označující sloty, ze kterých bude pixel shader později přijímat data. Zde zadaná sémantika musí odpovídat sémantice ve vstupu do pixel shaderu. Názvy proměnných a pořadí se mohou lišit.*/ float2 TexCoord : TEXCOORD0 ; }; VS_OUTPUT VS_Main ( float4 InPos : POSITION0 , float2 InTexCoord : TEXCOORD0 ) /* Pro každý vrchol výstupního objektu je spuštěn vertex shader . InPos a InTexCoord získané z dat mapování proudů */ { VS_OUTPUT Out ; float4x4 worldViewProj_matrix = mul ( world_matrix , view_matrix ); worldViewProj_matrix = mul ( worldViewProj_matrix , proj_matrix ); ven . Pos = mul ( InPos , worldViewProj_matrix ); // transformace vrcholu na clip-space Out . TexCoord = InTexCoord ; // souřadnice textury získáme zvenčí, není třeba nic upravovat vrátit se ven ; } /* ========== PIXEL SHADER ========== */ sampler2D baseMap ; // sampler2D je speciální "texture slot", do kterého lze načíst texturu. float4 PS_Main ( float2 texCoord : TEXCOORD0 ) : COLOR0 /* Pixel shader vždy vrací barvu vykresleného pixelu se sémantikou COLOR0 ve formátu float4. Pixel shader se spustí pro každý pixel vykresleného obrázku (ne pro každou texturu texel) */ { return tex2D ( baseMap , texCoord ); /* tex2d(sampler2D, float2) načte ze vzorníku textur (z textury) barvu svého texelu s danými souřadnicemi textury. To bude barva výstupního pixelu. */ }