HLSL

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 31. prosince 2016; kontroly vyžadují 13 úprav .

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.

Datové typy

HLSL podporuje skalární typy, vektorové typy, matice a struktury.

Skalární typy

Vektorové typy

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])

Matrice

Příklad: matrix <float, 4> view_matrix;

Příklad: float 4x4 view_matrix;

Struktury

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.

};

Operátoři

Operace Operátoři
Aritmetický -, +, *, /, %
zvýšit, snížit ++, --
hlavolam \|, ?:
unární !, -, +
Srovnání <, >, <=, >=, ==, !=
Účel =, -=, +=, *=, /=
Obsazení (Typ)
Čárka ,
Člen struktury .
Člen pole [index]

Větve

if (výraz) <příkaz> [ jinak <výrok>]

Cykly

V HLSL jsou 3 typy smyček:

Funkce

matematické funkce

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

texturní funkce

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.

Vstupní a výstupní data pro vertex a pixel shadery

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

Programy pro vytváření shaderů

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ř.

Příklady

nejjednodušší shader "mapování textur"

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. */ }

jednoduchý Vertigo shader

float4x4 view_proj_matrix : register ( c0 ); struct VS_OUTPUT { float4 Pos : POSITION ; float2 texCoord : TEXCOORD0 ; }; VS_OUTPUT VS_Dizzy ( float4 Pos : POSITION ) { VS_OUTPUT Out ; Poz . xy = znaménko ( Poz . xy ); ven . Pos = float4 ( Poz . xy , 0 , 1 ); ven . texCoord = Poz . xy ; vrátit se ven ; } float time_0_X : registr ( c0 ); plovákové kroužky : registr ( c1 ); plovoucí rychlost : registr ( c2 ); float exponent : register ( c3 ); float4 PS_Dizzy ( float2 texCoord : TEXCOORD0 ) : COLOR { float ang = atan2 ( texCoord . x , texCoord . y ); float rad = pow ( tečka ( texCoord , texCoord ), exponent ); return 0,5 * ( 1 + sin ( ang + zvonění * rad + rychlost * time_0_X )); }

shader, který simuluje elektrický výboj

struct VS_OUTPUT { float4 Pos : POSITION ; float2 texCoord : TEXCOORD ; }; VS_OUTPUT VS_Electricity ( float4 Pos : POSITION ) { VS_OUTPUT Out ; // Vyčištění nepřesností Poz . xy = znaménko ( Poz . xy ); ven . Pos = float4 ( Poz . xy , 0 , 1 ); ven . texCoord = Poz . xy ; vrátit se ven ; } float4 color : register ( c1 ); plovoucí zářeSíla : registr ( c2 ); výška plováku : registr ( c3 ); float glowFallOff : register ( c4 ); plovoucí rychlost : registr ( c5 ); float sampleDist : register ( c6 ); float ambientGlow : registr ( c7 ); float ambientGlowHeightScale : register ( c8 ); float vertNoise : register ( c9 ); float time_0_X : registr ( c0 ); sampler Hluk : registr ( s0 ); float4 PS_Electricity ( float2 texCoord : TEXCOORD ) : COLOR { float2 t = float2 ( rychlost * time_0_X * 0,5871 - vertNoise * abs ( texCoord . y ), rychlost * time_0_X ); // Vzorek na třech pozicích pro nějaké horizontální rozmazání // Shader by se měl sám jemně rozostřit ve svislém směru float xs0 = texCoord . x - sampleDist ; float xs1 = texCoord . x ; float xs2 = texCoord . x + sampleDist ; // Šum pro tři vzorky float noise0 = tex3D ( Noise , float3 ( xs0 , t )); float noise1 = tex3D ( Noise , float3 ( xs1 , t )); float noise2 = tex3D ( Noise , float3 ( xs2 , t )); // Poloha plováku blesku uprostřed0 = výška * ( hluk0 * 2 - 1 ) * ( 1 - xs0 * xs0 ); float mid1 = výška * ( hluk1 * 2 - 1 ) * ( 1 - xs1 * xs1 ); float mid2 = výška * ( hluk2 * 2 - 1 ) * ( 1 - xs2 * xs2 ); // Vzdálenost do flash float dist0 = abs ( texCoord . y - mid0 ); float dist1 = abs ( texCoord . y - mid1 ); float dist2 = abs ( texCoord . y - mid2 ); // Záře podle vzdálenosti k záblesku float glow = 1.0 - pow ( 0.25 * ( dist0 + 2 * dist1 + dist2 ), glowFallOff ); // Přidejte trochu okolní záře, abyste získali trochu energie ve vzduchu, vznášející se ambGlow = ambientGlow * ( 1 - xs1 * xs1 ) * ( 1 - abs ( ambientGlowHeightScale * texCoord . y )); return ( glowStrength * glow * glow + ambGlow ) * color ; }

model z plastelíny

float4x4 view_proj_matrix : register ( c0 ); float4 view_position : register ( c4 ); struct VS_OUTPUT { float4 Pos : POSITION ; float3 normal : TEXCOORD0 ; float3 viewVec : TEXCOORD1 ; }; VS_OUTPUT VS_Plastic ( float4 Pos : POSITION , float3 normal : NORMAL ) { VS_OUTPUT Out ; ven . Pos = mul ( view_proj_matrix , Pos ); ven . normální = normální ; ven . viewVec = pozice_pohledu - Poz ; vrátit se ven ; } float4 color : register ( c0 ); float4 PS_Plastic ( float3 normal : TEXCOORD0 , float3 viewVec : TEXCOORD1 ) : COLOR { float v = 0,5 * ( 1 + tečka ( normalizovat ( viewVec ), normální )); return v * barva ; }

Odkazy