語義學
語義是附加到着色器輸入或輸出的字符串,該字符串傳達有關參數的預期用途的信息。着色器階段之間傳遞的所有變量都需要語義。此處顯示了向着色器變量添加語義的語法(變量語法(DirectX HLSL))。
通常,流水線階段之間傳遞的數據是完全通用的,系統不會對其進行唯一解釋。允許沒有特殊含義的任意語義。包含這些特殊語義的參數(在Direct3D 10及更高版本中)稱爲系統值語義。
Direct3D 9和Direct3D 10及更高版本中支持的語義
Direct3D 9和Direct3D 10及更高版本均支持以下類型的語義。
頂點着色器語義
這些語義在附加到頂點着色器參數時具有含義。Direct3D 9和Direct3D 10及更高版本均支持這些語義。
表1 |
||
輸入值 |
描述 |
類型 |
BINORMAL[n] |
雙態 |
float4 |
BLENDINDICES[n] |
混合指數 |
int |
BLENDWEIGHT[n] |
混合權重 |
浮動 |
COLOR[n] |
漫反射和鏡面反射顏色 |
float4 |
NORMAL[n] |
法線向量 |
float4 |
POSITION[n] |
物體空間中的頂點位置。 |
float4 |
POSITIONT |
變換的頂點位置。 |
float4 |
PSIZE[n] |
點數 |
浮動 |
TANGENT[n] |
切線 |
float4 |
TEXCOORD [n] |
紋理座標 |
float4 |
Output |
描述 |
類型 |
COLOR[n] |
漫反射色或鏡面反射色 |
float4 |
FOG |
頂點霧 |
浮動 |
POSITION[n] |
頂點在均勻空間中的位置。用(x,y,z)除以w計算屏幕空間中的位置。每個頂點着色器都必須使用此語義寫出一個參數。 |
float4 |
PSIZE |
點數 |
浮動 |
TESSFACTOR [n] |
鑲嵌因子 |
浮動 |
TEXCOORD [n] |
紋理座標 |
float4 |
n是介於0和支持的資源數量之間的可選整數。例如,POSITION0,TEXCOOR1等。
像素着色器語義
這些語義在附加到像素着色器輸入參數時具有含義。Direct3D 9和Direct3D 10及更高版本均支持這些語義。
表2 |
||
輸入值 |
描述 |
類型 |
COLOR[n] |
漫反射或鏡面反射的顏色。 |
float4 |
TEXCOORD [n] |
紋理座標 |
float4 |
VFACE |
指示背面圖元的浮點標量。負值朝向後,而正值朝向相機。 [!注意] Direct3D 9 Shader Model 3.0中 |
浮動 |
VPOS |
屏幕空間中的像素位置(x,y)。要將Direct3D 9着色器(使用此語義)轉換爲Direct3D 10和更高版本的着色器,請參見Direct3D 9 VPOS和Direct3D 10 SV_Position) |
float2 |
Output |
描述 |
類型 |
COLOR[n] |
輸出顏色 |
float4 |
深度[n] |
輸出深度 |
浮動 |
n是介於0和支持的資源數量之間的可選整數。例如,PSIZE0,COLOR1等。
COLOR語義僅在着色器兼容模式下有效(即,使用D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY創建着色器時)。
僅Direct3D 10和更高版本支持語義。
以下是針對Direct3D 10的新引入的語義類型,不適用於Direct3D 9。
系統價值語義學
系統值語義是Direct3D 10的新增功能。所有系統值均以SV_前綴開頭,常見示例爲SV_POSITION,由光柵化程序階段解釋。系統值在管道的其他部分有效。例如,可以將SV_Position指定爲頂點着色器的輸入以及輸出。像素着色器只能寫入具有SV_Depth和SV_Target系統值語義的參數。
其他系統值(SV_VertexID,SV_InstanceID,SV_IsFrontFace)只能輸入到可以解釋特定值的管道中的第一個活動着色器中。之後,着色器函數必須將值傳遞到後續階段。
SV_PrimitiveID是該規則的一個例外,該規則僅輸入到可以解釋特定值的管線中的第一個活動着色器中。硬件可以提供與輸入相同的ID值到船體着色器階段,域着色器階段,然後在第一個啓用的階段之後:幾何着色器階段或像素着色器階段。
如果啓用了細分,則將存在船體着色器階段和域着色器階段。對於給定的修補程序,相同的PrimitiveID將應用於修補程序的外殼着色器調用以及所有細分的域着色器調用。相同的PrimitiveID也會傳播到下一個活動階段。啓用了幾何着色器階段或像素着色器階段。
如果幾何着色器輸入SV_PrimitiveID,並且由於每次調用它可以輸出零個或一個或多個基本體,則如果後續的像素着色器輸入SV_PrimtiveID,則着色器必須爲每個輸出基本體編程其自己的SV_PrimitiveID值選擇。
作爲另一個示例,SV_PrimitiveID無法由頂點着色器階段解釋,因爲頂點可以是多個圖元的成員。
這些語義已添加到Direct3D 10中。它們在Direct3D 9中不可用。
光柵化程序階段的系統值語義。
表3 |
||
系統值語義 |
描述 |
類型 |
SV_ClipDistance [n] |
剪輯距離數據。每個SV_ClipDistance值都假定爲到平面的float32有符號距離。圖元設置僅對插值平面距離> = 0的像素調用光柵化。通過將一個或多個頂點元素的多個組件聲明爲SV_ClipDistance,可以同時實現多個剪切平面。剪輯和剔除距離值的組合最多在最多D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT個寄存器中最多爲D3D#_CLIP_OR_CULL_DISTANCE_COUNT個分量。適用於所有要讀取或寫入的着色器,但頂點着色器可以寫入值,但不能將其用作輸入。 |
浮動 |
SV_CullDistance [n] |
剔除距離數據。給頂點元素的組件賦予該標籤時,這些值均假定爲到平面的float32有符號距離。如果圖元中所有頂點的平面距離小於0,則圖元將被完全丟棄。通過將一個或多個頂點元素的多個分量聲明爲SV_CullDistance,可以同時使用多個剔除平面。剪輯和剔除距離值的組合最多在最多D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT個寄存器中最多爲D3D#_CLIP_OR_CULL_DISTANCE_COUNT個分量。適用於所有要讀取或寫入的着色器,但頂點着色器可以寫入值,但不能將其用作輸入。 |
浮動 |
SV_Coverage |
可以在像素着色器的輸入,輸出或兩者上指定的蒙版。 |
int |
SV_Depth |
深度緩衝區數據。可以由像素着色器編寫。 |
浮動 |
SV_DepthGreaterEqual |
在像素着色器中,允許輸出深度,只要它大於或等於光柵化器確定的值即可。啓用調整深度而不禁用早期Z。 |
未知 |
SV_DepthLessEqual |
在像素着色器中,只要其小於或等於光柵化器確定的值,就允許輸出深度。啓用調整深度而不禁用早期Z。 |
未知 |
按組的每個維度定義Dispatch調用中的全局線程偏移量。可用作計算着色器的輸入。(只讀) |
uint3 |
|
定義要評估的當前域點在船體上的位置。可用作域着色器的輸入。(只讀) |
float2 | 3 |
|
在分派調用中按分派調用的每個維度定義組偏移。可用作計算着色器的輸入。(只讀) |
uint3 |
|
爲給定組中的給定線程提供扁平化索引。可用作計算着色器的輸入。(只讀) |
int |
|
按組的每個尺寸定義組內的螺紋偏移。可用作計算着色器的輸入。(只讀) |
uint3 |
|
定義幾何着色器的實例。可用作幾何着色器的輸入。需要使用該實例,因爲在同一幾何圖元上最多可以調用32次幾何着色器。 |
int |
|
SV_InnerCoverage |
表示被低估的保守光柵化信息(即,是否保證像素被完全覆蓋)。可以由像素着色器讀取或寫入。 |
|
定義貼片表面內的鑲嵌數量。在外殼着色器中可用以進行寫入,在域着色器中可用以進行讀取。 |
浮點數|浮點數[2] |
|
SV_InstanceID |
運行時自動生成的按實例的標識符(請參閱使用系統生成的值(Direct3D 10))。適用於所有着色器。 |
|
SV_IsFrontFace |
指定三角形是否爲正面。對於線和點,IsFrontFace的值爲true。唯一的例外是從三角形繪製的線(線框模式),其設置IsFrontFace的方式與在實體模式下柵格化三角形的方式相同。可以由幾何着色器寫入,也可以由像素着色器讀取。 |
布爾 |
定義通過調用外殼着色器的主入口點進行操作的控制點ID的索引。只能由船體着色器讀取。 |
int |
|
SV_Position |
聲明SV_Position以輸入到着色器時,可以指定以下兩種插值模式之一:linearNoPerspective或linearNoPerspectiveCentroid,其中後者導致在進行多采樣抗鋸齒時提供質心捕捉的xyzw值。在着色器中使用時,SV_Position描述像素位置。在所有着色器中均可用,以使像素中心偏移0.5。 |
float4 |
SV_PrimitiveID |
運行時自動生成的按原始標識符(請參閱使用系統生成的值(Direct3D 10))。可以由幾何或像素着色器寫入,並可以由幾何,像素,外殼或域着色器讀取。 |
int |
SV_RenderTargetArrayIndex |
渲染目標數組索引。應用於幾何着色器輸出,並指示像素着色器將繪製圖元的渲染目標數組切片。SV_RenderTargetArrayIndex僅在渲染目標是數組資源時纔有效。此語義僅適用於基元。如果一個圖元具有多個頂點,則使用前導頂點的值。此值還指示深度/模板視圖的哪個數組切片用於讀/寫目的。 |
int |
SV_SampleIndex |
採樣頻率索引數據。僅可由像素着色器讀取或寫入。 |
int |
SV_StencilRef |
表示當前的像素着色器模具參考值。只能由像素着色器寫入。 |
int |
SV_Target[n], where 0 <= n <= 7 |
將存儲在渲染目標中的輸出值。索引指示要寫入8個可能綁定的渲染目標中的哪一個。該值可用於所有着色器。 |
浮動[2 | 3 | 4] |
在面片的每個邊緣上定義鑲嵌數量。可用於在船體着色器中寫入和在域着色器中讀取。 |
浮動[2 | 3 | 4] |
|
SV_VertexID |
運行時自動生成的每個頂點標識符(請參閱使用系統生成的值(Direct3D 10))。僅可用作頂點着色器的輸入。 |
int |
SV_ViewportArrayIndex |
視口數組索引。應用於幾何着色器輸出,並指示當前寫出的圖元要使用哪個視口。可以由像素着色器讀取。在將原語傳遞到柵格化器之前,將對其進行變換並根據索引指定的視口裁剪。此語義僅適用於基元。如果一個圖元具有多個頂點,則使用前導頂點的值。 |
int |
編寫SV_Depth時的限制:
- 當多次採樣(在D3D10_RASTERIZER_DESC中,MultisampleEnable爲TRUE)並寫入深度值(使用像素着色器)時,寫入的單個值也用於深度測試;因此,在進行多重採樣時,將失去以更高的分辨率渲染原始邊緣的能力。
- 使用動態流控制時,無法確定在編譯時是否可以保證在某些路徑中寫入SV_Depth的着色器在每次執行時都可以寫入SV_Depth。聲明時未能寫入SV_Depth會導致未定義的行爲(可能包括也可能不包括丟棄像素)。
- 包括+/- INF和NaN在內的任何float32值都可以寫入SV_Depth。
- 執行雙源色彩混合時,寫入SV_Depth仍然有效。
從Direct3D 9遷移到Direct3D 10及更高版本
將代碼從Direct3D 9遷移到Direct3D 10及更高版本時,應考慮以下問題:
映射到Direct3D 9語義
Direct3D 10和更高版本中的一些語義直接映射到Direct3D 9語義。
表4 |
|
Direct3D 10語義 |
Direct3D 9等效語義 |
SV_Depth |
DEPTH |
SV_Position |
POSITION |
SV_Target |
COLOR |
表5 |
|
給Direct3D 9開發人員的注意事項:對於Direct3D 9目標,着色器語義必須映射到有效的Direct3D 9語義。爲了向後兼容,POSITION0(及其變體名稱)被視爲SV_Position,COLOR被視爲SV_TARGET。 |
複製中
- [Mapping to Direct3D 9 Semantics](#mapping-to-direct3d-9-semantics)
- [Direct3D 9 VPOS and Direct3D 10 SV\_Position](#direct3d-9-vpos-and-direct3d-10-sv_position)
- [User clip planes in HLSL](#user-clip-planes-in-hlsl)
Direct3D 9 VPOS和Direct3D 10 SV_Position
D3D10語義SV_Position提供與Direct3D 9着色器模型3 VPOS語義類似的功能。例如,在Direct3D 9中,以下語法用於使用屏幕空間座標的像素着色器:
複製中
float4 psMainD3D9( float4 screenSpace : VPOS ) : COLOR
{
// code here
}
由於POSITION語義旨在用於對象空間座標,因此添加了VPOS以支持着色器模型3,以指定屏幕空間座標。
在Direct3D 10和更高版本中,SV_Position語義(當在像素着色器的上下文中使用時)指定屏幕空間座標(偏移0.5)。因此,Direct3D 9着色器將大致等效於以下內容(不考慮0.5偏移):
複製中
float4 psMainD3D10( float4 screenSpace : SV_Position ) : COLOR
{
// code here
}
從Direct3D 9遷移到Direct3D 10及更高版本時,在轉換着色器時需要注意這一點。