HLSL

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 31. december 2016; checks kræver 13 redigeringer .

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.

Datatyper

HLSL understøtter skalartyper, vektortyper, matricer og strukturer.

Skalartyper

Vektortyper

Eksempel: vektor <float, 4> farve;

Eksempel: float4 newcolor;

Eksempel: float oldcolor[4]

Eksempel: nyfarve = float4(gammelfarve[0], gammelfarve[1], gammelfarve[2], gammelfarve[3])

Matricer

Eksempel: matrix <float, 4> view_matrix;

Eksempel: float 4x4 view_matrix;

Strukturer

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.

};

Operatører

Operationer Operatører
Aritmetik -, +, *, /, %
forøge, formindske ++, --
hjerne teaser \|, ?:
Unær !, -, +
Sammenligninger <, >, <=, >=, ==, !=
Formål =, -=, +=, *=, /=
Cast (type)
Komma ,
Struktur medlem .
Array medlem [indeks]

Filialer

if (udtryk) <sætning> [ andet <udsagn>]

Cykler

Der er 3 typer sløjfer i HLSL:

Funktioner

matematiske funktioner

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

teksturfunktioner

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.

Input og output data for vertex og pixel shaders

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

Programmer til at skabe shaders

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.

Eksempler

den enkleste "Texture mapping" shader

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

en simpel 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 = tegn ( Pos . xy ); ud . Pos = float4 ( Pos . xy , 0 , 1 ); ud . texCoord = Pos . xy ; vende tilbage Ud ; } float time_0_X : register ( c0 ); flyderinge : register ( c1 ) ; flydehastighed : register ( c2 ) ; flydende eksponent : register ( c3 ); float4 PS_Dizzy ( float2 texCoord : TEXCOORD0 ) : FARVE { float ang = atan2 ( texCoord . x , texCoord . y ); float rad = pow ( dot ( texCoord , texCoord ), eksponent ); return 0,5 * ( 1 + sin ( ang + ringe * rad + hastighed * tid_0_X )); }

shader, der simulerer en elektrisk udladning

struct VS_OUTPUT { float4 Pos : POSITION ; float2 texCoord : TEXCOORD ; }; VS_OUTPUT VS_Electricity ( float4 Pos : POSITION ) { VS_OUTPUT Out ; // Ryd op for unøjagtigheder Pos . xy = tegn ( Pos . xy ); ud . Pos = float4 ( Pos . xy , 0 , 1 ); ud . texCoord = Pos . xy ; vende tilbage Ud ; } float4 farve : register ( c1 ); float glødStyrke : register ( c2 ); flydehøjde : register ( c3 ) ; float glowFallOff : register ( c4 ); flydehastighed : register ( c5 ) ; float sampleDist : register ( c6 ); float ambientGlow : register ( c7 ); float ambientGlowHeightScale : register ( c8 ); float vertStøj : register ( c9 ); float time_0_X : register ( c0 ); sampler Støj : register ( s0 ); float4 PS_Electricity ( float2 texCoord : TEXCOORD ) : COLOR { float2 t = float2 ( speed * time_0_X * 0,5871 - vertNoise * abs ( texCoord . y ), speed * time_0_X ); // Prøve ved tre positioner for en vis vandret sløring // Shaderen skal sløres fint af sig selv i lodret retning float xs0 = texCoord . x - sampleDist ; float xs1 = texCoord . x ; float xs2 = texCoord . x + sampleDist ; // Støj for de tre prøver float noise0 = tex3D ( Noise , float3 ( xs0 , t )); float noise1 = tex3D ( Støj , float3 ( xs1 , t )); float noise2 = tex3D ( Støj , float3 ( xs2 , t )); // Placeringen af ​​blitzen flyder mid0 = højde * ( støj0 * 2 - 1 ) * ( 1 - xs0 * xs0 ); float mid1 = højde * ( støj1 * 2 - 1 ) * ( 1 - xs1 * xs1 ); flyde mid2 = højde * ( støj2 * 2 - 1 ) * ( 1 - xs2 * xs2 ); // Afstand til flash float dist0 = abs ( texCoord . y - mid0 ); float dist1 = abs ( texCoord . y - mid1 ); float dist2 = abs ( texCoord . y - mid2 ); // Glød i henhold til afstand til flash float glød = 1,0 - pow ( 0,25 * ( dist0 + 2 * dist1 + dist2 ), glowFallOff ); // Tilføj noget ambient glød for at få noget kraft i luften følelsen float ambGlow = ambientGlow * ( 1 - xs1 * xs1 ) * ( 1 - abs ( ambientGlowHeightScale * texCoord . y )); return ( glødStrength * glow * glow + ambGlow ) * farve ; }

plasticine model

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 ; ud . Pos = mul ( view_proj_matrix , Pos ); ud . normal = normal ; ud . viewVec = view_position - Pos ; vende tilbage Ud ; } float4 farve : register ( c0 ); float4 PS_Plastic ( float3 normal : TEXCOORD0 , float3 viewVec : TEXCOORD1 ) : COLOR { float v = 0,5 * ( 1 + prik ( normaliser ( viewVec ), normal )); returnere v * farve ; }

Links