HLSL ( High Level Shader Language ) er et højt niveau C -lignende sprog til shader -programmering .
Det blev skabt af Microsoft og inkluderet i DirectX 9.0-pakken.
HLSL understøtter skalartyper, vektortyper, matricer og strukturer.
Eksempel: vektor <float, 4> farve;
Eksempel: float4 newcolor;
Eksempel: float oldcolor[4]
Eksempel: nyfarve = float4(gammelfarve[0], gammelfarve[1], gammelfarve[2], gammelfarve[3])
Eksempel: matrix <float, 4> view_matrix;
Eksempel: 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; float CustomVar; texture2D CustomTexture; //og så videre... :POSITION :NORMAL osv. er sentimatik, mere om dem nedenfor.};
Operationer | Operatører |
---|---|
Aritmetik | -, +, *, /, % |
forøge, formindske | ++, -- |
hjerne teaser | \|, ?: |
Unær | !, -, + |
Sammenligninger | <, >, <=, >=, ==, != |
Formål | =, -=, +=, *=, /= |
Cast | (type) |
Komma | , |
Struktur medlem | . |
Array medlem | [indeks] |
if (udtryk) <sætning> [ andet <udsagn>]
Der er 3 typer sløjfer i HLSL:
abs(x) | returnerer den absolutte værdi af hver x-komponent |
acos(x) | returnerer buecosinus for hver x-komponent. Hver komponent skal være i området [-1, 1] |
asin(x) | returnerer arcsinus for hver x-komponent. Hver komponent skal være i området [-pi/2, pi/2] |
atan(x) | returnerer buetangensen for hver x-komponent. Hver komponent skal være i området [-pi/2, pi/2] |
loft (x) | returnerer det mindste heltal, der er større end eller lig med x (rund op) |
cos(x) | returnerer cosinus af x |
kontanter (x) | returnerer den hyperbolske cosinus af x |
klemme(x, a, b) | Hvis x < a, returnerer a, hvis x > b, returnerer b, ellers returnerer x. |
ddx(x) | returnerer den partielle afledede af x i forhold til skærm-space x-koordinaten |
ddy(x) | returnerer den partielle afledede af x i forhold til skærm-rummets y-koordinat |
grader (x) | Konverter x fra radianer til grader |
afstand(a,b) | returnerer afstanden mellem to punkter a og b |
prik(a,b) | returnerer prikproduktet af to vektorer a og b |
exp(x) | returnerer eksponenten med grundtallet e eller e x |
etage(x) | returnerer det største heltal, der er mindre end eller lig med x (rund ned) |
frac( x ) | returnerer brøkdelen af x. |
fwidth (x) | returnerer abs(ddx(x))+abs(ddy(x)) |
len(v) | Vektor længde |
længde (v) | returnerer længden af vektoren v |
lerp(a, b, s) | returnerer a + s (b - a) |
log(x) | returnerer logaritmen af x |
log10(x) | returnerer decimallogaritmen af x |
modf(x, ud ip) | vender tilbage til brøk- og heltalsdelen af x, hver del har samme fortegn som x |
mul(a, b) | laver en matrixmultiplikation mellem a og b |
normalisere(v) | returnerer en normaliseret vektor v |
pow(x, y) | returnerer x y |
radianer(x) | konverter x fra grader til radianer |
reflektere(i, n) | returnerer reflektionsvektoren |
bryde(i, n, eta) | returnerer refraktionsvektoren. |
rund ( x ) | returnerer det nærmeste heltal. |
rsqrt(x) | returnerer 1 / sqrt(x) |
mætte (x) | Samme som klemme(x,0,1) |
synd(x) | returnerer sinus af x. |
sincos(x, ud s, ud c) | returnerer sinus og cosinus af x |
sinh(x) | returnerer den hyperbolske sinus af x |
sqrt(x) | returnerer kvadratroden af hver komponent |
trin (a, x) | returnerer 1 hvis x >= a, ellers returnerer 0 |
tan(x) | returnerer tangens af x |
tanh(x) | returnerer den hyperbolske tangens af x |
tex1D(s, t) | Læsning fra en endimensionel tekstur s - sampler, t - skalar. |
tex1D(s, t, ddx, ddy) | Læsning fra en endimensionel tekstur, hvor afledte s er sampler, t, ddx og ddy er skalarer. |
tex1Dproj(s, t) | Læsning fra en endimensionel projektiv tekstur s - sampler, t - 4D vektor. t divideres med tw før funktionen udføres. |
tex1Dbias(s, t) | Aflæsning fra en endimensionel tekstur med en offset er s en sampler, t er en 4-dimensionel vektor. Mip-niveauet forskydes med tw, før søgningen udføres. |
tex2D(s, t) | Aflæsning fra en 2D-tekstur s er en sampler, t er en 2D-vektor. |
tex2D(s, t, ddx, ddy) | Læsning fra en 2D-tekstur med derivater. s - sampler, t - 2D teksturkoordinater. ddx, ddy- 2D vektorer. |
tex2Dproj(s, t) | Læsning fra en 2D projektiv tekstur. s - sampler, t - 4D vektor. t divideres med tw før funktionen udføres. |
tex2Dbias(s, t) | Læsning fra en 2D-tekstur med en offset. s er en sampler, t er en 4-dimensionel vektor. Mip-niveauet forskydes med tw, før søgningen udføres. |
tex3D(s, t) | Læsning fra en 3D-tekstur. s - sampler, t - 3D vektor. |
tex3D(s, t, ddx, ddy) | Læsning fra en 3D-tekstur med derivater. s - sampler, t - 2D teksturkoordinater, ddx, ddy - 3D vektorer. |
tex3Dproj(s, t) | Læsning fra en 3D projektiv tekstur. s - sampler, t - 4D vektor. t divideres med tw før funktionen udføres. |
tex3Dbias(s, t) | Læsning fra en 3D-tekstur med en offset. s er en sampler, t er en 4-dimensionel vektor. Mip-niveauet forskydes med tw, før søgningen udføres. |
texCUBE(r, t) | Læsning fra en terningtekstur. s - sampler, t - 3D teksturkoordinater. |
texCUBE(s, t, ddx, ddy) | Læsning fra en terningtekstur. s - sampler, t - 3D teksturkoordinater, ddx, ddy - 3D vektorer. |
texCUBEproj(s, t) | Læsning fra en kubisk projektiv tekstur. s - sampler, t - 4D vektor. t divideres med tw før funktionen udføres. |
texCUBEbias(s, t) | Læsning fra en terningtekstur. sampler, t er en 4D-vektor. Mip-niveauet forskydes med tw, før søgningen udføres. |
Vertex og fragment shaders har to inputtyper: varierende og ensartet .
Ensartet - data, der er konstant til flere gange i skyggen. Erklæring af ensartede data i HLSL kan gøres på to måder:
1) Erklær dataene som en ekstern variabel. For eksempel:
float4 værdi; float4 main() : FARVE { returværdi; }2) Deklarer dataene via den ensartede kvalifikation. For eksempel:
float4 main (ensartet float4-værdi): FARVE { returværdi; }Ensartede variable specificeres via en tabel med konstanter. Konstanttabellen indeholder alle de registre, der konstant bruges i shaderen.
Varierende er data, der er unikke for hvert shader-kald. For eksempel: position, normal osv. I vertex shaderen beskriver denne semantik de varierende data, der sendes fra vertexbufferen, og i fragment shaderen de interpolerede data modtaget fra vertex shaderen.
Vigtigste indgående semantiske typer:
BINORMAL | Binormal |
---|---|
BLENDVÆGT | Vægtkoefficient |
BLENDINDICES | Vægt matrix indeks |
FARVE | Farve |
NORMAL | Normal |
POSITION | Position |
PSIZE | Prikstørrelse |
TANGENT | Tangent |
TESSFACTOR | Tessellationsfaktor _ |
TEXCOORD | Teksturkoordinater |
Brug af varierende data i en fragmentskygge bestemmer tilstanden af et enkelt fragment. Vigtigste indgående semantiske typer:
FARVE | Farve |
---|---|
TEXCOORD | Teksturkoordinater |
Udgående data for vertex shader:
POSITION | Position |
---|---|
PSIZE | Prikstørrelse |
TÅGE | Tågefaktor for toppunkt |
FARVE | Farve |
TEXCOORD | Teksturkoordinater |
Udgående data for fragmentskyggeren:
FARVE | Farve |
---|---|
DYBDE | Dybde værdi |
For at lette skrivningen af shaders findes der en række programmer, der giver dig mulighed for at komponere shaders og straks se resultatet.
Pixel shaders bruges også af renderere, f.eks.
Koden i denne liste fungerer i ATI Rendermonkey og Nvidia FX-komponist. For at bruge det i en brugerdefineret motor, skal du angive SamplerState og teknik.
/* ========== VERTEX SHADER =========== */ /* world_matrix, view_matrix, proj_matrix skal hentes fra applikationen ved at indstille shader-konstanter. Shader-konstanter indlæses i registre. */ float4x4 verdensmatrix ; // verdensmatrix float4x4 view_matrix ; // matrix som float4x4 proj_matrix ; // projektionsmatrix struct VS_OUTPUT // en instans af denne struct vil returnere en vertex shader { float4 Pos : POSITION0 ; /* POSITION0 og TEXCOORD0 er semantik, der angiver de slots, hvorfra pixel shaderen senere vil modtage data. Den semantik, der er angivet her, skal matche semantikken i input til pixel shader. Variablenavne og rækkefølge kan variere.*/ float2 TexCoord : TEXCOORD0 ; }; VS_OUTPUT VS_Main ( float4 InPos : POSITION0 , float2 InTexCoord : TEXCOORD0 ) /* vertex shader udføres for hvert toppunkt i outputobjektet. InPos og InTexCoord hentet fra stream-mapping-data */ { VS_OUTPUT Out ; float4x4 worldViewProj_matrix = mul ( world_matrix , view_matrix ); worldViewProj_matrix = mul ( worldViewProj_matrix , proj_matrix ); ud . Pos = mul ( InPos , worldViewProj_matrix ); // transformer vertex til clip-space Out . TexCoord = InTexCoord ; // vi får teksturkoordinater udefra, intet skal ændres vende tilbage Ud ; } /* ========== PIXEL SHADER =========== */ sampler2D baseMap ; // sampler2D er en speciel "tekstur slot", hvori en tekstur kan indlæses. float4 PS_Main ( float2 texCoord : TEXCOORD0 ) : COLOR0 /* Pixel-shaderen returnerer altid farven på den gengivede pixel med COLOR0-semantik i float4-format. Pixelshaderen udføres for hver pixel i det renderede billede (ikke for hver tekstur-texel) */ { return tex2D ( baseMap , texCoord ); /* tex2d(sampler2D, float2) læser fra tekstur sampleren (fra teksturen) farven på dens texel med de givne teksturkoordinater. Dette vil være farven på outputpixlen. */ }