HLSL

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt hozzászólók, és jelentősen eltérhet a 2016. december 31-én felülvizsgált verziótól ; az ellenőrzések 13 szerkesztést igényelnek .

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.

Adattípusok

A HLSL támogatja a skaláris típusokat, vektortípusokat, mátrixokat és struktúrákat.

Skaláris típusok

Vektortípusok

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

Mátrixok

Példa: mátrix <float, 4> view_matrix;

Példa: float 4x4 view_matrix;

Struktúrák

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.

};

Operátorok

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]

Ágak

if (kifejezés) <állítás> [ else <állítás>]

Ciklusok

A HLSL-ben háromféle hurok létezik:

Funkciók

matematikai függvények

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

textúra függvények

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.

Bemeneti és kimeneti adatok vertex és pixel shaderekhez

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

Shader létrehozására szolgáló programok

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.

Példák

a legegyszerűbb "Texture Mapping" shader

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

egy egyszerű 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 ; Pos . xy = jel ( Poz . xy ); ki . Pos = float4 ( Poz . xy , 0 , 1 ); ki . texCoord = Poz . xy ; return Out ; } float time_0_X : regiszter ( c0 ); úszógyűrűk : regiszter ( c1 ) ; lebegési sebesség : regiszter ( c2 ); float kitevő : regiszter ( c3 ); float4 PS_Dizzy ( float2 texCoord : TEXCOORD0 ) : SZÍN { float ang = atan2 ( texCoord . x , texCoord . y ); float rad = pow ( pont ( texCoord , texCoord ), kitevő ); return 0,5 * ( 1 + sin ( ang + gyűrűk * rad + sebesség * idő_0_X )); }

árnyékoló, amely elektromos kisülést szimulál

struct VS_OUTPUT { float4 Pos : POSITION ; float2 texCoord : TEXCOORD ; }; VS_OUTPUT VS_Electricity ( float4 Pos : POSITION ) { VS_OUTPUT Out ; // Pontatlanságok eltávolítása Poz . xy = jel ( Poz . xy ); ki . Pos = float4 ( Poz . xy , 0 , 1 ); ki . texCoord = Poz . xy ; return Out ; } float4 szín : regiszter ( c1 ); float glowErősség : regiszter ( c2 ); úszómagasság : regiszter ( c3 ) ; float glowFallOff : regiszter ( c4 ); float speed : regiszter ( c5 ); float sampleDist : regiszter ( c6 ); float ambientGlow : regiszter ( c7 ); float ambientGlowHeightScale : regiszter ( c8 ); float vertNoise : register ( c9 ); float time_0_X : regiszter ( c0 ); sampler Noise : register ( s0 ); float4 PS_Electricity ( float2 texCoord : TEXCOORD ) : SZÍN { float2 t = float2 ( sebesség * idő_0_X * 0,5871 - vertNoise * abs ( texCoord . y ), sebesség * idő_0_X ); // Mintavétel három pozícióban némi vízszintes elmosódáshoz // A shadernek magától finoman elmosódnia kell függőleges irányban float xs0 = texCoord . x - sampleDist ; float xs1 = texCoord . x ; float xs2 = texCoord . x + sampleDist ; // Zaj a három mintához float noise0 = tex3D ( Noise , float3 ( xs0 , t )); float noise1 = tex3D ( Zaj , float3 ( xs1 , t )); float noise2 = tex3D ( Zaj , float3 ( xs2 , t )); // A flash float helyzete mid0 = magasság * ( zaj0 * 2 - 1 ) * ( 1 - xs0 * xs0 ); float mid1 = magasság * ( zaj1 * 2 - 1 ) * ( 1 - xs1 * xs1 ); float mid2 = magasság * ( zaj2 * 2 - 1 ) * ( 1 - xs2 * xs2 ); // Távolság a flash floatig dist0 = abs ( texCoord . y - mid0 ); float dist1 = abs ( texCoord . y - mid1 ); float dist2 = abs ( texCoord . y - mid2 ); // Izzás a villanófénytől való távolság szerint = 1,0 - pow ( 0,25 * ( dist0 + 2 * dist1 + dist2 ), glowFallOff ); // Adjon hozzá némi környezeti fényt, hogy erőt kapjon a levegőben float ambGlow = ambientGlow * ( 1 - xs1 * xs1 ) * ( 1 - abs ( ambientGlowHeightScale * texCoord . y )); return ( glowStrength * glow * glow + ambGlow ) * szín ; }

gyurma modell

float4x4 view_proj_matrix : register ( c0 ); float4 view_position : regiszter ( c4 ); struct VS_OUTPUT { float4 Pos : POSITION ; float3 normál : TEXCOORD0 ; float3 viewVec : TEXCOORD1 ; }; VS_OUTPUT VS_Plastic ( float4 Pos : POSITION , float3 normal : NORMAL ) { VS_OUTPUT Out ; ki . Pos = mul ( view_proj_matrix , Pos ); ki . normál = normál ; ki . viewVec = view_position - Pos ; return Out ; } float4 szín : regiszter ( c0 ); float4 PS_Plastic ( float3 normál : TEXCOORD0 , float3 viewVec : TEXCOORD1 ) : SZÍN { float v = 0,5 * ( 1 + pont ( normalizálás ( viewVec ), normál )); return v * szín ; }

Linkek