如何:設計定義域著色器

網域著色器是三個階段中的第三個階段,可一起實 作鑲嵌。 定義域著色器會從殼層著色器和 UV 座標的轉換控制點產生表面幾何。 本主題說明如何設計網域著色器。

固定函式鑲嵌器所產生的每個點都會叫用網域著色器一次。 輸入是修補程式上點的 UV[W] 座標,以及來自殼面著色器的所有輸出資料,包括控制點和修補常數。 輸出是以任何所需方式定義的頂點。 如果要將輸出傳送至圖元著色器,輸出必須包含位置 (以SV_Position語意) 表示。

設計定義域著色器

  1. 定義定義域屬性。

    [domain("quad")]
    

    網域是針對四個修補程式所定義。

  2. 使用 網域位置 系統值在殼體上宣告位置。

    • 針對四個修補程式,請使用 float2。
    • 針對三個修補程式,請使用 float3 (作為直心座標)
    • 針對 isoline,請使用 float2。

    因此,四方修補程式的網域位置看起來像這樣:

    float2 UV : SV_DomainLocation
    
  3. 定義其他輸入。

    其他輸入則來自殼層著色器,而且是使用者定義的。 這包括修補的輸入控制點,其中可以介於 1 到 32 點之間,以及輸入修補程式常數資料。

    控制點是使用者定義的,通常是結構,例如如何 :設計殼層著色器) 中定義的結構,例如此結構 (:

    const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch
    

    修補程式常數資料也是使用者定義的,而且看起來可能像如何 :設計殼層著色器) 中所定義的 (:

    HS_CONSTANT_DATA_OUTPUT input
    
  4. 新增使用者定義的程式碼以計算輸出;這會構成網域著色器的主體。

    這個結構包含使用者定義的定義域著色器輸出。

    struct DS_OUTPUT
    {
        float3 vNormal    : NORMAL;
        float2 vUV        : TEXCOORD;
        float3 vTangent   : TANGENT;
        float3 vBiTangent : BITANGENT;
    
        float4 vPosition  : SV_POSITION;
    };
    

    函式會從鑲嵌器) 取得每個輸入 UV (,並評估位於這個位置的 Bezier 修補程式。

    [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;    
    }
    

    此函式會針對固定函數鑲嵌器所產生的每個點叫用一次。 由於此範例使用四個修補程式,因此輸入網域位置 (SV_DomainLocation) 是 float2 (UV) ;三個修補程式會有 float3 輸入位置 (UVW 直心座標) ,而 isoline 會有 float2 輸入網域位置。

    函式的其他輸入會直接來自殼層著色器。 在此範例中,每個控制點都是 BEZIER_CONTROL_POINT,以及修補常數資料 (HS_CONSTANT_DATA_OUTPUT) 。 輸出是頂點,其中包含任何所需的資料 - 在此範例中 DS_OUTPUT

設計網域著色器之後,請參閱 如何:建立定義域著色器

如何使用 Direct3D 11

鑲嵌概觀