Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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