Grundlegende Grammatik von HLSL

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

Ich denke du magst

Origin blog.csdn.net/mango9126/article/details/107036143
Empfohlen
Rangfolge