使用系統產生的值

系統產生的值由 IA 階段產生(基於使用者提供的輸入 語意),以提升著色器操作的效率。

透過附加資料,例如實例 ID(VS 可見)、頂點 ID(VS 可見)或原始 ID(GS/PS 可見),後續著色器階段可尋找這些系統值以優化該階段的處理。 例如,VS 階段可能會尋找實例 id,以取得著色器所需的額外每個頂點資料或執行其他操作;GS 與 PS 階段可使用原始 ID 以相同方式擷取每個基元資料。

備註

這些 Direct3D 系統產生的數值適用於應用程式,無論它們使用 Win32 或 UWP 應用程式模型。

VertexID

每個著色器階段都使用頂點 ID 來識別每個頂點。 它是一個 32 位元無符號整數,預設值為 0。 當 IA 階段處理原元時,它會被指派到頂點。 將頂點 id 語意附加到著色器輸入宣告中,通知 IA 階段產生每個頂點的 ID。

IA 會為每個頂點加上一個頂點 ID,供著色器階段使用。 每次繪圖呼叫時,頂點 ID 都會遞增 1。 在各個索引繪製呼叫之間,計數會重設回起始值。 對於 ID3D11DeviceContext::DrawIndexed 與 ID3D11DeviceContext::DrawIndexedInstanced,頂點 ID 代表索引值。 若頂點 id 溢出(超過 2³²–1),則包裹為 0。

對於所有原始類型,頂點都有一個頂點 ID(不論相鄰關係如何)。

原始ID

每個著色器階段都會使用一個原始 ID 來識別每個原體。 它是一個 32 位元無符號整數,預設值為 0。 當 IA 階段處理圖元時,它會被指派給該圖元。 要通知 IA 階段產生原始 ID,請將原始 id 語意附加到著色器輸入宣告中。

IA 階段會為每個圖元加入一個圖元 ID,供幾何著色器或像素著色器階段使用(以 IA 階段之後第一個啟用的階段為準)。 對於每個索引繪製呼叫,原始 ID 會增加 1,但每當有新實例開始時,原始 ID 會重置為 0。 所有其他繪製呼叫都不會改變實例 ID 的值。如果實例 ID 溢位(超過 2³²–1),則會回繞至 0。

像素著色器階段沒有獨立的原始 ID 輸入;然而,任何指定原始 ID 的像素著色器輸入都會使用恆定插值模式。

目前不支援為相鄰圖元自動產生圖元 ID。 對於具有鄰接的原始型態,例如帶有鄰接的三角形帶,僅對內部圖元(非相鄰的圖元)保留原始 ID,就像三角形帶中沒有鄰接的圖元集合一樣。

InstanceID

每個著色器階段都會使用一個實例 ID,用來識別目前正在處理的幾何體實例。 它是一個 32 位元無符號整數,預設值為 0。

如果頂點著色器輸入宣告包含實例 id 語意,IA 階段會在每個頂點新增一個實例 ID。 對於每個索引式繪製呼叫,實例 ID 都會遞增 1。 所有其他繪圖呼叫都不會改變 instance ID 的值。若 instance ID 溢位(超過 2³²–1),則會回繞至 0。

範例

下圖展示了系統值如何附加在 IA 階段的實例化三角形帶上。

實例化三角形條帶系統值的示意圖

這些表格顯示了同一三角形帶兩個實例所產生的系統值。 第一個實例(實例 U)以藍色表示,第二個實例(實例 V)以綠色顯示。 實線連接原元中的頂點,虛線連接相鄰頂點。

以下表格顯示系統為實例 U 產生的數值。

頂點資料 C,U D,U E,U F,U G,U H,U I,U J,U K,U L,U
VertexID 0 1 2 3 4 5 6 7 8 9
InstanceID 0 0 0 0 0 0 0 0 0 0

 

價值 價值 價值
原始ID 0 1 2
InstanceID 0 0 0

 

以下表格顯示系統為實例 V 產生的數值。

頂點資料 C,V D,V E,V F,V G,V H,V I,V J,V K,V L,V
VertexID 0 1 2 3 4 5 6 7 8 9
InstanceID 1 1 1 1 1 1 1 1 1 1

 

價值 價值 價值
原始ID 0 1 2
InstanceID 1 1 1

 

輸入組譯器產生 ID(頂點、原始碼與實例);同時也請注意,每個實例都有獨特的實例 ID。資料以條狀切割結束,將三角形條的每個實例分隔開來。

Input-Assembler 階段