Freigeben über


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

  1. Definieren Sie das Domänenattribute.

    [domain("quad")]
    

    Die Domäne ist für einen Quad-Patch definiert.

  2. 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
    
  3. 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
    
  4. 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.

Verwenden von Direct3D 11

Tessellation– Übersicht