Vorgehensweise: Entwerfen eines Domänenshaders
Ein Domänenshader ist die dritte von drei Phasen, die bei der Implementierung von Tessellation zusammenarbeiten. Der Domänen-Shader generiert die Oberflächengeometrie aus den transformierten Steuerungspunkten aus einem Hull-Shader und den UV-Koordinaten. In diesem Thema wird gezeigt, wie Sie einen Domänenshader entwerfen.
Für jeden Punkt, der vom festen Funktions-Tessellator generiert wird, wird einmal ein Domänenshader aufgerufen. Die Eingaben sind die UV[W]-Koordinaten des Punkts auf dem Patch sowie alle Ausgabedaten aus dem Hull-Shader, einschließlich Kontrollpunkte und Patchkonstanten. Die Ausgabe ist ein Scheitelpunkt, der in beliebiger Weise definiert ist. Wenn die Ausgabe an den Pixel-Shader gesendet wird, muss die Ausgabe eine Position enthalten (die mit einer SV_Position Semantik gekennzeichnet ist).
So entwerfen Sie einen Domänenshader
Definieren Sie das Domänenattribute.
[domain("quad")]
Die Domäne ist für einen Quad-Patch definiert.
Deklarieren Sie den Speicherort auf der Hülle mit dem Wert des Domänenstandortsystems .
- Verwenden Sie für einen Quad-Patch ein float2.
- Verwenden Sie für einen Tri-Patch einen float3 (für baryzentrische Koordinaten).
- Verwenden Sie für eine Isolinie eine float2.
Daher sieht der Domänenspeicherort für einen Quad-Patch wie folgt aus:
float2 UV : SV_DomainLocation
Definieren Sie die anderen Eingaben.
Die anderen Eingaben stammen aus dem Hull-Shader und sind benutzerdefinierte. Dies umfasst die Eingabesteuerungspunkte für Patch, von denen zwischen 1 und 32 Punkte vorhanden sein können, und Eingabepatchkonstantendaten.
Die Steuerungspunkte sind benutzerdefinierte, in der Regel mit einer Struktur wie dieser (definiert in How To: Design a Hull Shader):
const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch
Die Patchkonstantedaten sind ebenfalls benutzerdefinierter Art und können wie folgt aussehen (definiert in How To: Design a Hull Shader):
HS_CONSTANT_DATA_OUTPUT input
Fügen Sie benutzerdefinierten Code hinzu, um die Ausgaben zu berechnen. dies bildet den Textkörper des Domänen-Shaders.
Diese Struktur enthält benutzerdefinierte Domänenshaderausgaben.
struct DS_OUTPUT { float3 vNormal : NORMAL; float2 vUV : TEXCOORD; float3 vTangent : TANGENT; float3 vBiTangent : BITANGENT; float4 vPosition : SV_POSITION; };
Die Funktion übernimmt jeden Eingabe-UV (vom Tessellator) und wertet den Bézier-Patch an dieser Position aus.
[domain("quad")] DS_OUTPUT BezierEvalDS( HS_CONSTANT_DATA_OUTPUT input, float2 UV : SV_DomainLocation, const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch ) { DS_OUTPUT Output; // Insert code to compute the output here. return Output; }
Die Funktion wird einmal für jeden Punkt aufgerufen, der vom festen Funktionstesellator generiert wird. Da in diesem Beispiel ein Quad-Patch verwendet wird, ist der Eingabedomänenspeicherort (SV_DomainLocation) ein float2 (UV); ein Tri-Patch hätte eine float3-Eingabeposition (UVW-baryzentrische Koordinaten), und eine Isolinie hätte einen float2-Eingabedomänenstandort.
Die anderen Eingaben für die Funktion stammen direkt aus dem Hull-Shader. In diesem Beispiel sind es 16 Kontrollpunkte, die jeweils ein BEZIER_CONTROL_POINT sowie Patchkonstantendaten (HS_CONSTANT_DATA_OUTPUT) sind. Die Ausgabe ist ein Scheitelpunkt, der alle gewünschten Daten enthält – DS_OUTPUT in diesem Beispiel.
Nach dem Entwerfen eines Domänenshaders finden Sie weitere Informationen unter Vorgehensweise: Erstellen eines Domänenshaders.
Zugehörige Themen