HLSL ( High Level Shader Language ) on korkean tason C - kaltainen kieli Shader - ohjelmointiin .
Sen on luonut Microsoft ja se sisältyy DirectX 9.0 -pakettiin.
HLSL tukee skalaarityyppejä, vektorityyppejä, matriiseja ja rakenteita.
Esimerkki: vektori <float, 4> color;
Esimerkki: float4 newcolor;
Esimerkki: float oldcolor[4]
Esimerkki: uusi väri = float4(vanha väri[0], vanha väri[1], vanha väri[2], vanha väri[3])
Esimerkki: matriisi <float, 4> view_matrix;
Esimerkki: 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; kellua CustomVar; texture2D CustomTexture; //ja niin edelleen... :POSITION :NORMAL jne. ovat sentimaattisia, niistä lisää alla.};
Toiminnot | Operaattorit |
---|---|
Aritmeettinen | -, +, *, /, % |
lisäys, vähennys | ++, -- |
aivojumppa | \|, ?: |
Unaarinen | !, -, + |
Vertailut | <, >, <=, >=, ==, != |
Tarkoitus | =, -=, +=, *=, /= |
Heittää | (tyyppi) |
Pilkku | , |
Rakenteen jäsen | . |
Array jäsen | [indeksi] |
if (lauseke) <lause> [ muuten <lauseke>]
HLSL:ssä on kolmenlaisia silmukoita:
abs(x) | palauttaa kunkin x-komponentin itseisarvon |
acos(x) | palauttaa jokaisen x-komponentin kaarikosinin. Jokaisen komponentin on oltava alueella [-1, 1] |
asin(x) | palauttaa jokaisen x-komponentin arsinin. Jokaisen komponentin on oltava alueella [-pi/2, pi/2] |
atan(x) | palauttaa jokaisen x-komponentin arctangentin. Jokaisen komponentin on oltava alueella [-pi/2, pi/2] |
katto (x) | palauttaa pienimmän kokonaisluvun, joka on suurempi tai yhtä suuri kuin x (pyöristys ylöspäin) |
cos(x) | palauttaa x:n kosinin |
käteistä (x) | palauttaa x:n hyperbolisen kosinin |
puristin (x, a, b) | Jos x < a, palauttaa a:n, jos x > b, palauttaa b, muuten palauttaa x:n. |
ddx(x) | palauttaa x:n osittaisen derivaatan näyttöavaruuden x-koordinaatin suhteen |
ddy(x) | palauttaa x:n osittaisen derivaatan näyttöavaruuden y-koordinaatin suhteen |
astetta (x) | Muunna x radiaaneista asteina |
etäisyys (a, b) | palauttaa kahden pisteen a ja b välisen etäisyyden |
piste(a,b) | palauttaa kahden vektorin a ja b pistetulon |
exp(x) | palauttaa eksponentin kantaluvulla e tai e x |
kerros (x) | palauttaa suurimman kokonaisluvun, joka on pienempi tai yhtä suuri kuin x (pyöristys alas) |
frac( x ) | palauttaa x:n murto-osan. |
fwidth(x) | palauttaa abs(ddx(x))+abs(ddy(x)) |
len(v) | Vektorin pituus |
pituus (v) | palauttaa vektorin v pituuden |
lerp(a, b, s) | palauttaa a + s (b - a) |
loki(x) | palauttaa x:n logaritmin |
log10(x) | palauttaa x:n desimaalilogaritmin |
modf(x, out ip) | palaa x:n murto- ja kokonaislukuosaan, jokaisella osalla on sama merkki kuin x:llä |
mul(a, b) | tekee matriisikertoa a:n ja b:n välillä |
normalisoi (v) | palauttaa normalisoidun vektorin v |
pow(x, y) | palauttaa x y |
radiaanit(x) | muuntaa x asteista radiaaneiksi |
heijastaa(i, n) | palauttaa heijastusvektorin |
taittuu(i, n, eta) | palauttaa taitevektorin. |
pyöreä ( x ) | palauttaa lähimmän kokonaisluvun. |
rsqrt(x) | palauttaa 1 / sqrt(x) |
kyllästetty(x) | Sama kuin puristin(x,0,1) |
synti(x) | palauttaa x:n sinin. |
sincos(x, out s, out c) | palauttaa x:n sinin ja kosinin |
sinh(x) | palauttaa x:n hyperbolisen sinin |
sqrt(x) | palauttaa kunkin komponentin neliöjuuren |
vaihe (a, x) | palauttaa 1, jos x >= a, muussa tapauksessa palauttaa 0 |
tan(x) | palauttaa x:n tangentin |
tanh(x) | palauttaa x:n hyperbolisen tangentin |
tex1D(s, t) | Lukeminen yksiulotteisesta tekstuurista s - sampleri, t - skalaari. |
tex1D(s, t, ddx, ddy) | Lukeminen yksiulotteisesta tekstuurista, jossa derivaatat s ovat sampleri, t, ddx ja ddy ovat skalaareja. |
tex1Dproj(t, t) | Lukeminen yksiulotteisesta projektiivisesta tekstuurista s - sampleri, t - 4D-vektori. t jaetaan tw:llä ennen funktion suorittamista. |
tex1Dbias(s, t) | Lukemalla yksiulotteisesta tekstuurista, jossa on offset, s on sampleri, t on 4-ulotteinen vektori. Mip-tasoa siirretään tw:llä ennen haun suorittamista. |
tex2D(s, t) | Lukeminen 2D-tekstuurista s on sampleri, t on 2D-vektori. |
tex2D(s, t, ddx, ddy) | Lukeminen 2D-tekstuurista johdannaisten kanssa. s - sampleri, t - 2D-tekstuurikoordinaatit. ddx, ddy- 2D-vektorit. |
tex2Dproj(s, t) | Lukeminen 2D-projektiotekstuurista. s - sampleri, t - 4D-vektori. t jaetaan tw:llä ennen funktion suorittamista. |
tex2Dbias(s, t) | Lukeminen 2D-tekstuurista offsetilla. s on näytteenottolaite, t on 4-ulotteinen vektori. Mip-tasoa siirretään tw:llä ennen haun suorittamista. |
tex3D(s, t) | Lukeminen 3D-tekstuurista. s - sampleri, t - 3D-vektori. |
tex3D(s, t, ddx, ddy) | Lukeminen 3D-tekstuurista johdannaisten kanssa. s - sampleri, t - 2D-tekstuurikoordinaatit, ddx, ddy - 3D-vektorit. |
tex3Dproj(t, t) | Lukeminen 3D-projektiotekstuurista. s - sampleri, t - 4D-vektori. t jaetaan tw:llä ennen funktion suorittamista. |
tex3Dbias(t, t) | Lukeminen 3D-tekstuurista offsetilla. s on näytteenottolaite, t on 4-ulotteinen vektori. Mip-tasoa siirretään tw:llä ennen haun suorittamista. |
texCUBE(t, t) | Lukeminen kuution tekstuurista. s - sampleri, t - 3D-tekstuurikoordinaatit. |
texCUBE(s, t, ddx, ddy) | Lukeminen kuution tekstuurista. s - sampleri, t - 3D-tekstuurikoordinaatit, ddx, ddy - 3D-vektorit. |
texCUBEproj(s, t) | Lukeminen kuutioprojektiivisesta tekstuurista. s - sampleri, t - 4D-vektori. t jaetaan tw:llä ennen funktion suorittamista. |
texCUBEbias(t, t) | Lukeminen kuution tekstuurista. sampleri, t on 4D-vektori. Mip-tasoa siirretään tw:llä ennen haun suorittamista. |
Vertex- ja fragment-varjostimilla on kaksi syöttötyyppiä: vaihteleva ja yhtenäinen .
Uniform - tiedot, jotka ovat vakioita useaan käyttöön Shaderissa. Yhtenäisen datan ilmoittaminen HLSL:ssä voidaan tehdä kahdella tavalla:
1) Ilmoita tiedot ulkoiseksi muuttujaksi. Esimerkiksi:
float4-arvo; float4 main() : VÄRI { palautusarvo; }2) Ilmoita tiedot yhtenäisen tarkenteen kautta. Esimerkiksi:
float4 main (yhtenäinen float4-arvo) : COLOR { palautusarvo; }Tasaiset muuttujat määritetään vakiotaulukon kautta. Vakiotaulukko sisältää kaikki varjostimessa jatkuvasti käytetyt rekisterit.
Vaihteleva on dataa, joka on yksilöllinen jokaiselle Shader-kutsulle. Esimerkiksi: sijainti, normaali jne. Vertex-varjostimessa tämä semantiikka kuvaa vertex-puskurista välitettävää vaihtelevaa dataa ja fragmenttivarjostimessa vertex-varjostimesta vastaanotettua interpoloitua dataa.
Tärkeimmät saapuvat semanttiset tyypit:
BINORMAALI | Binormaali |
---|---|
BLENDWEIGHT | Painokerroin |
BLENDINDICES | Painomatriisiindeksi |
VÄRI | Väri |
NORMAALI | Normaali |
SIJOITUS | asema |
KOKO | Pisteen koko |
TANGENTTI | Tangentti |
TESSFACTOR | Tesselaatiotekijä _ |
TEXCOORD | Tekstuurin koordinaatit |
Vaihtelevan tiedon käyttäminen fragmenttivarjostimessa määrittää yksittäisen fragmentin tilan. Tärkeimmät saapuvat semanttiset tyypit:
VÄRI | Väri |
---|---|
TEXCOORD | Tekstuurin koordinaatit |
Vertex-varjostimen lähtevät tiedot:
SIJOITUS | asema |
---|---|
KOKO | Pisteen koko |
SUMU | Vertexin sumutekijä |
VÄRI | Väri |
TEXCOORD | Tekstuurin koordinaatit |
Fragmenttien varjostimen lähtevät tiedot:
VÄRI | Väri |
---|---|
SYVYYS | Syvyysarvo |
Varjostimien kirjoittamisen helpottamiseksi on olemassa useita ohjelmia, joiden avulla voit luoda varjostimia ja tarkastella tulosta välittömästi.
Pikselivarjostimia käyttävät myös renderöijät, esim.
Tässä luettelossa oleva koodi toimii ATI Rendermonkeyssa ja Nvidia FX -säveltäjässä. Jotta voit käyttää sitä mukautetussa moottorissa, sinun on määritettävä SamplerState ja tekniikka.
/* ========== VERTEX SHADER ========== */ /* world_matrix, view_matrix, proj_matrix täytyy saada sovelluksesta asettamalla varjostusvakiot. Shader-vakiot ladataan rekistereihin. */ float4x4 world_matrix ; // maailmanmatriisi float4x4 view_matrix ; // matriisi kuten float4x4 proj_matrix ; // projektiomatriisi struct VS_OUTPUT // tämän rakenteen esiintymä palauttaa vertex-varjostimen { float4 Pos : POSITION0 ; /* POSITION0 ja TEXCOORD0 ovat semantiikkaa, jotka osoittavat aikavälejä, joista pikselivarjostin myöhemmin vastaanottaa tietoja. Tässä määritellyn semantiikan on vastattava syötteen ja pikselivarjostimen semantiikkaa. Muuttujien nimet ja järjestys voivat vaihdella.*/ float2 TexCoord : TEXCOORD0 ; }; VS_OUTPUT VS_Main ( float4 InPos : POSITION0 , float2 InTexCoord : TEXCOORD0 ) /* Vertex-varjostin suoritetaan jokaiselle tulosobjektin pisteelle. InPos ja InTexCoord saatu stream-kartoitustiedoista */ { VS_OUTPUT Out ; float4x4 worldViewProj_matrix = mul ( maailman_matriisi , näkymän_matriisi ); worldViewProj_matrix = mul ( worldViewProj_matrix , proj_matrix ); ulos . Pos = mul ( InPos , worldViewProj_matrix ); // muuntaa kärkipisteen clip-space Out . TexCoord = InTexCoord ; // saamme tekstuurikoordinaatit ulkopuolelta, mitään ei tarvitse muokata paluu ulos ; } /* ========== PIXEL SHADER ========== */ sampler2D baseMap ; // sampler2D on erityinen "tekstuuripaikka", johon tekstuurin voi ladata. float4 PS_Main ( float2 texCoord : TEXCOORD0 ) : COLOR0 /* Pikselivarjostin palauttaa aina renderoidun pikselin värin COLOR0-semantiikalla float4-muodossa. Pikselivarjostin suoritetaan jokaiselle renderoidun kuvan pikselille (ei jokaiselle tekstuuretekselille) */ { return tex2D ( baseMap , texCoord ); /* tex2d(sampler2D, float2) lukee tekstuurinäyttelijältä (tekstuurista) tekselinsä värin annetuilla pintakoordinaateilla. Tämä on tulosteen pikselin väri. */ }