如何:設計定義域著色器
網域著色器是三個階段中的第三個階段,可一起實 作鑲嵌。 定義域著色器會從殼層著色器和 UV 座標的轉換控制點產生表面幾何。 本主題說明如何設計網域著色器。
固定函式鑲嵌器所產生的每個點都會叫用網域著色器一次。 輸入是修補程式上點的 UV[W] 座標,以及來自殼面著色器的所有輸出資料,包括控制點和修補常數。 輸出是以任何所需方式定義的頂點。 如果要將輸出傳送至圖元著色器,輸出必須包含位置 (以SV_Position語意) 表示。
設計定義域著色器
定義定義域屬性。
[domain("quad")]
網域是針對四個修補程式所定義。
使用 網域位置 系統值在殼體上宣告位置。
- 針對四個修補程式,請使用 float2。
- 針對三個修補程式,請使用 float3 (作為直心座標)
- 針對 isoline,請使用 float2。
因此,四方修補程式的網域位置看起來像這樣:
float2 UV : SV_DomainLocation
定義其他輸入。
其他輸入則來自殼層著色器,而且是使用者定義的。 這包括修補的輸入控制點,其中可以介於 1 到 32 點之間,以及輸入修補程式常數資料。
控制點是使用者定義的,通常是結構,例如如何 :設計殼層著色器) 中定義的結構,例如此結構 (:
const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch
修補程式常數資料也是使用者定義的,而且看起來可能像如何 :設計殼層著色器) 中所定義的 (:
HS_CONSTANT_DATA_OUTPUT input
新增使用者定義的程式碼以計算輸出;這會構成網域著色器的主體。
這個結構包含使用者定義的定義域著色器輸出。
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 。
設計網域著色器之後,請參閱 如何:建立定義域著色器。
相關主題