Die grundlegende Syntax des Skalartyps HLSL
1-Datentyp
1.1
1. bool: Richtig oder falsch. Beachten Sie, dass die HLSL die richtigen und falschen Schlüsselwörter wie in C ++ bereitstellt.
2. int: 32-Bit-Ganzzahl mit Vorzeichen.
3. Hälfte: 16-Bit-Gleitkommazahl.
4. float: 32-Bit-Gleitkommazahl.
5. double: 64-Bit-Gleitkommazahl.
1.2 Vektortypen
1.2.1 Vektortypen
1. float2: 2D-Vektor, wobei die Komponenten vom Typ float sind.
2. float3: 3D-Vektor, wobei die Komponenten vom Typ float sind.
3. float4: 4D-Vektor, wobei die Komponenten vom Typ float sind.
Zusätzlich zu float können wir auch andere Grundtypen verwenden, um Vektoren zu definieren, wie z. B. bool2, int3. Kurz gesagt, der Ausdruckstyp von Vektoren ist TypeN, wobei N zu (2,4) gehört.
1.2.2 Initialisierung des Vektors
float3 v = {1.0f, 2.0f, 3.0f};
float2 w = float2 (x, y);
float4 u = float4 (w, 3.0f, 4.0f); // u = (wx, wy, 3.0f, 4.0f)
1.2.3 Vektorzugriff
Verwenden Sie die Array-Syntax:
Wie zum Beispiel: vec [i] = 2,0f;
Verwenden Sie die alphabetische Syntax xyzw, rgba.
Sowie:
vec.x = vec.r = 1.0f;
vec.y = vec.g = 2,0f;
vec.z = vec.b = 3.0f;
vec.w = vec.a = 4.0f;
1.2.4 Ersetzen und Bereitstellen von Vektoren (Swizzles)
Um die Komplexität der Vektorzuweisung zu vermeiden, wendet HLSL die Swizzles-Methode wie folgt an:
float4 u = {1.0f, 2.0f, 3.0f, 4.0f};
float4 v = {0.0f, 0.0f, 5.0f, 6.0f};
v = u.wyyx; // v = {4.0f, 2.0f, 2.0f, 1.0f}
v = u.wzyx; // v = {4.0f, 3.0f, 2.0f, 1.0f}
v.xy = u; // v = {1.0f, 2.0f, 5.0f, 6.0f}
1.3 Matrixtyp
1.3.1 Matrixdefinitionssyntax
Typem × n xxx; wie:
1. float2x2: 2 × 2-Matrix, wobei die Einträge vom Typ float sind.
2. half3x3: 3 × 3-Matrix, wobei die Einträge vom Typ half sind.
3. int4x4: 4 × 4-Matrix, wobei die Einträge vom Typ int sind.
4. bool3x4: 3 × 4-Matrix, wobei die Einträge vom Typ bool sind.
1.3.2 Zugriff auf die Matrix
Verwenden Sie die Array-Syntax:
M [i] [j] = Wert;
Verwenden Sie die Syntax der Mitgliedsvariablen:
M._11 = M._12 = M._13 = M._14 = 0.0f;
M._21 = M._22 = M._23 = M._24 = 0.0f;
M._31 = M._32 = M._33 = M._34 = 0.0f;
M._41 = M._42 = M._43 = M._44 = 0.0f;
oder
M._m00 = M._m01 = M._m02 = M._m03 = 0.0f;
M._m10 = M._m11 = M._m12 = M._m13 = 0.0f;
M._m20 = M._m21 = M._m22 = M._m23 = 0.0f;
M._m30 = M._m31 = M._m32 = M._m33 = 0.0f;
Die gesamte Reihe der Besuche:
float3 N = normalisieren (pIn.normalW);
float3 T = normalisieren (pIn.tangentW-Punkt (pIn.tangentW, N) * N);
float3 B = Kreuz (N, T);
float3x3 TBN;
TBN [0] = T; // setzt Zeile 1
TBN [1] = B; // setzt Zeile 2
TBN [2] = N; // setzt Zeile 3
1.3.3 Initialisierung der Matrix
float2x2 fxx = float2x2 (1.0f, 2.0f, 3.0f, 4.0f);
int2x2 ixx = {1,2,3,4};
1.3.4 Alternative Definition des Array-Vektors
Vektor u = {1,0f, 2,0f, 3,0f, 4,0f};
Matrix M; // 4x4 Matrix
1.4 Array
float M [4] [4];
halbes p [4];
float3 v [12]; // 12 3D-Vektoren
1.5 Struktur
Die Struktur in HLSL ähnelt der Struktur in C. Sie kann keine Funktionsmitglieder enthalten, und Zugriffsmitglieder müssen nur auf Indizes basieren.
struct SurfaceInfo
{ float3 pos; float3 normal; float4 diffuse; float4 spec; }; SurfaceInfo v; litColor + = v.diffuse; Punkt (lightVec, v.normal); float specPower = max (v.spec.a, 1.0f);
1.6 Schlüsselwörter zu Variablen
typedef , statisch , einheitlich , extern , const
Die Verwendung ähnelt der in C ++. Wenn eine Variable als statisch deklariert wird, bedeutet dies, dass die Variable eine interne Variable ist und außerhalb des Shader-Programms nicht sichtbar ist. Nicht statische globale Variablen sind standardmäßig extern, dh sie können von Programmen außerhalb des Shader-Programms aufgerufen werden.
1.7 Erzwungene Typkonvertierung
Die Typkonvertierung in HLSL ist sehr flexibel, wie unten gezeigt:
float f = 5,0f;
float4x4 m = (float4x4) f; // kopiere fin in jeden Eintrag von m.
float3 n = float3 (...);
float3 v = 2,0f * n - 1,0f;
Die 1.0f hier wird tatsächlich in (1.0f, 1.0f, 1.0f) konvertiert;
2 Syntax und Funktionen
2.1 Syntax
2.1.1 zurück
return (Ausdruck);
2.1.2 if-else-Anweisung
if (Bedingung)
{}
……………………………………
if (Bedingung)
{}
sonst
{}
2.1.3 für Schleife
für (Anfangszustand; Zustand; Zunahme)
{}
2.14 während
während (Bedingung)
{}
2.1.5do-while
machen
{} while (Bedingung);
2.2 Funktion
2.2.1 Merkmale der HLSL-Funktion
Ähnlich wie in C ++ werden Parameter als Wert übergeben (Referenzen und Zeiger werden nicht unterstützt), Rekursion wird nicht unterstützt und Funktionen sind immer inline
2.2.2 Funktionsbeispiele
bool foo(in const bool b, out int r1,inout float r2)
{
if(b)// test input value
{
r1= 5; // output a value through r1
}
else
{
r1 = 1; // output a value through r1
}
//sincer2 is inout we can use it as an input value and also output a value through it
r2= r2 * r2 * r2;
returntrue;
}
Was hier erklärt werden muss, sind die Schlüsselwörter in, out, inout
in: Standardmäßig müssen Sie es nicht hinzufügen. Gibt an, dass der Parameterwert übergeben werden muss
out: Gibt an, dass der Parameter ein Rückgabewert der Funktion ist, der nur als Ausgabe verwendet wird und nicht als Eingabe verwendet werden kann
inout: sowohl Eingabe als auch Ausgabe
3 Die Semantik
in HLSL verwendet häufig eine Form wie xxx: POSITION, wenn HLSL definiert wird, ob es sich um eine in eine Funktion eingegebene Parametervariable oder eine zurückgegebene Variable handelt. Hier ist eine Stelle, die Variablen in HLSL unterscheidet. Das folgende ':' wird als Semantik bezeichnet. Es wird verwendet, um einige Informationen von Variablen zu beschreiben. Wenn es um Semantik geht, besteht das Wesentliche darin, die Beziehung zwischen Shader-Variablen und Hardware anzugeben. Beispielsweise gibt POSITION an, dass diese Variable in a verwendet wird positionsbezogenes Register.
3.1 Die Semantik von Vertex-Shadern
Die Semantik besteht aus Eingabe- und Ausgabeteilen. Informationen zur Eingabe und Ausgabe des Scheitelpunkts finden Sie im Folgenden:
Eingang
Beschreibung
Art
BINORMAL [n]
Binormal
float4
BLENDINDICES [n]
Mischungsindizes
uint
MISCHGEWICHT [n]
Gewichte mischen
schweben
FARBE [n]
Diffuse und spiegelnde Farbe
float4
NORMAL [n]
Normaler Vektor
float4
POSITION [n]
Scheitelpunktposition im Objektraum.
float4
POSITIONT
Transformierte Scheitelpunktposition.
float4
PSIZE [n]
Punktgröße
schweben
TANGENT [n]
Tangente
float4
TEXCOORD [n]
Texturkoordinaten
float4
Ausgabe
Beschreibung
Art
FARBE [n]
Diffuse oder spiegelnde Farbe
float4
NEBEL
Scheitelnebel
schweben
POSITION [n]
Position eines Scheitelpunkts im homogenen Raum. Berechnen Sie die Position im Bildschirmraum, indem Sie (x, y, z) durch w teilen. Jeder Vertex-Shader muss einen Parameter mit dieser Semantik ausschreiben.
float4
PSIZE
Punktgröße
schweben
TESSFAKTOR [n]
Tessellationsfaktor
schweben
TEXCOORD [n]
Texturkoordinaten
float4
Aus dem Obigen ist ersichtlich, dass die Semantik hinter der Variablen nicht zufällig hinzugefügt wird. Erstens zeigt sie die Verwendung der Variablen an, und zweitens gibt es spezielle Einschränkungen für die Semantik der Eingabe und Ausgabe. Wir können keine Semantik verwenden, die als verwendet wird eine Eingabe als Ausgabe.
n ist der Indexwert des Registers, und der Maximalwert hängt von der Unterstützung der Hardware ab. Wie POSITION1.
3.2 Die Semantik von Pixel-Shadern
Eingang
Beschreibung
Art
FARBE [n]
Diffuse oder spiegelnde Farbe.
float4
TEXCOORD [n]
Texturkoordinaten
float4
VFACE
Gleitkomma-Skalar, der ein nach hinten gerichtetes Grundelement anzeigt. Ein negativer Wert zeigt nach hinten, während ein positiver Wert zur Kamera zeigt.
schweben
VPOS
Die Pixelposition (x, y) im Bildschirmbereich. Informationen zum Konvertieren eines Direct3D 9-Shaders (der diese Semantik verwendet) in einen Direct3D 10-Shader finden Sie unter Direct3D 9 VPOS und Direct3D 10 SV_Position.
float2
Ausgabe
Beschreibung
Art
FARBE [n]
Ausgabefarbe
float4
TIEFE [n]
Ausgabetiefe
schweben
3.3 Beispiele
void SkyVS (float3posL: POSITION0, out float4 oPosH: POSITION0, out float3 oEnvTex: TEXCOORD0)
{ oPosH = mul (float4 (posL, 1.0f), g_matWVP) .xyww; oEnvTex = posL; }}
/.
struct OutputVS
{ float4 posH: POSITION0; float2 tex0: TEXCOORD0; // D3D füllt Punkt-Sprites aus. Schwimmergröße: PSIZE; // In Pixel. }; OutputVSSnowVS (float3 posL: POSITION0, float3 vel: TEXCOORD0, float size: TEXCOORD1, float initialT: TEXCOORD2, float lifeT: TEXCOORD3) { OutputVS outVS = (OutputVS) 0; float t = g_Time - initialT; posL = posL + vel * t + 0,5f * g_Acc * t * t; outVS.posH = mul (float4 (posL, 1.0f), g_matWVP);
outVS.size = 0.0035f * g_ViewportHeight * size;
return outVS;
}
float4 SnowPS (float2tex0: TEXCOORD0): COLOR
{ return tex2D (TexS, tex0); }}
Referenzen
[1] Einführung in die 3D-Spielprogrammierung mit DirectX11
[2] Semantik (DirectX HLSL) in Microsoft DirectX Sampler