語義學
語義是附加到着色器輸入或輸出的字元串,該字元串傳達有關參數的預期用途的資訊。着色器階段之間傳遞的所有變量都需要語義。此處顯示了向着色器變量添加語義的文法(變量文法(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中 提供了此語義。對于Direct3D 10及更高版本,請改用SV_IsFrontFace。 | 浮動 |
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個分量。适用于所有要讀取或寫入的着色器,但頂點着色器可以寫入值,但不能将其用作輸入。 該clipplanes屬性上的所有硬體像SV_ClipDistance的作品,但作品特征級 9_x高。有關更多資訊,請參見功能9級硬體上的使用者剪輯平面。 | 浮動 |
SV_CullDistance [n] | 剔除距離資料。給頂點元素的元件賦予該标簽時,這些值均假定為到平面的float32有符号距離。如果圖元中所有頂點的平面距離小于0,則圖元将被完全丢棄。通過将一個或多個頂點元素的多個分量聲明為SV_CullDistance,可以同時使用多個剔除平面。剪輯和剔除距離值的組合最多在最多D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT個寄存器中最多為D3D#_CLIP_OR_CULL_DISTANCE_COUNT個分量。适用于所有要讀取或寫入的着色器,但頂點着色器可以寫入值,但不能将其用作輸入。 | 浮動 |
SV_Coverage | 可以在像素着色器的輸入,輸出或兩者上指定的蒙版。 對于像素着色器上的SV_Coverage,在ps_4_1或更高版本上支援OUTPUT。 對于像素着色器上的SV_Coverage,INPUT要求ps_5_0或更高。 | int |
SV_Depth | 深度緩沖區資料。可以由像素着色器編寫。 | 浮動 |
SV_DepthGreaterEqual | 在像素着色器中,允許輸出深度,隻要它大于或等于光栅化器确定的值即可。啟用調整深度而不禁用早期Z。 | 未知 |
SV_DepthLessEqual | 在像素着色器中,隻要其小于或等于光栅化器确定的值,就允許輸出深度。啟用調整深度而不禁用早期Z。 | 未知 |
SV_DispatchThreadID | 按組的每個次元定義Dispatch調用中的全局線程偏移量。可用作計算着色器的輸入。(隻讀) | uint3 |
SV_DomainLocation | 定義要評估的目前域點在船體上的位置。可用作域着色器的輸入。(隻讀) | float2 | 3 |
SV_GroupID | 在分派調用中按分派調用的每個次元定義組偏移。可用作計算着色器的輸入。(隻讀) | uint3 |
SV_GroupIndex | 為給定組中的給定線程提供扁平化索引。可用作計算着色器的輸入。(隻讀) | int |
SV_GroupThreadID | 按組的每個尺寸定義組内的螺紋偏移。可用作計算着色器的輸入。(隻讀) | uint3 |
SV_GSInstanceID | 定義幾何着色器的執行個體。可用作幾何着色器的輸入。需要使用該執行個體,因為在同一幾何圖元上最多可以調用32次幾何着色器。 | int |
SV_InnerCoverage | 表示被低估的保守光栅化資訊(即,是否保證像素被完全覆寫)。可以由像素着色器讀取或寫入。 | |
SV_InsideTessFactor | 定義貼片表面内的鑲嵌數量。在外殼着色器中可用以進行寫入,在域着色器中可用以進行讀取。 | 浮點數|浮點數[2] |
SV_InstanceID | 運作時自動生成的按執行個體的辨別符(請參閱使用系統生成的值(Direct3D 10))。适用于所有着色器。 | |
SV_IsFrontFace | 指定三角形是否為正面。對于線和點,IsFrontFace的值為true。唯一的例外是從三角形繪制的線(線框模式),其設定IsFrontFace的方式與在實體模式下栅格化三角形的方式相同。可以由幾何着色器寫入,也可以由像素着色器讀取。 | 布爾 |
SV_OutputControlPointID | 定義通過調用外殼着色器的主入口點進行操作的控制點ID的索引。隻能由船體着色器讀取。 | int |
SV_Position | 聲明SV_Position以輸入到着色器時,可以指定以下兩種插值模式之一:linearNoPerspective或linearNoPerspectiveCentroid,其中後者導緻在進行多采樣抗鋸齒時提供質心捕捉的xyzw值。在着色器中使用時,SV_Position描述像素位置。在所有着色器中均可用,以使像素中心偏移0.5。 | float4 |
SV_PrimitiveID | 運作時自動生成的按原始辨別符(請參閱使用系統生成的值(Direct3D 10))。可以由幾何或像素着色器寫入,并可以由幾何,像素,外殼或域着色器讀取。 | int |
SV_RenderTargetArrayIndex | 渲染目标數組索引。應用于幾何着色器輸出,并訓示像素着色器将繪制圖元的渲染目标數組切片。SV_RenderTargetArrayIndex僅在渲染目标是數組資源時才有效。此語義僅适用于基元。如果一個圖元具有多個頂點,則使用前導頂點的值。此值還訓示深度/模闆視圖的哪個數組切片用于讀/寫目的。 可以從幾何着色器寫入,也可以由像素着色器讀取。 如果D3D11_FEATURE_DATA_D3D11_OPTIONS3 :: VPAndRTArrayIndexFromAnyShaderFeedingRasterizer為true,則SV_RenderTargetArrayIndex會應用到為栅格化器供電的任何着色器。 | int |
SV_SampleIndex | 采樣頻率索引資料。僅可由像素着色器讀取或寫入。 | int |
SV_StencilRef | 表示目前的像素着色器模具參考值。隻能由像素着色器寫入。 | int |
SV_Target[n], where 0 <= n <= 7 | 将存儲在渲染目标中的輸出值。索引訓示要寫入8個可能綁定的渲染目标中的哪一個。該值可用于所有着色器。 | 浮動[2 | 3 | 4] |
SV_TessFactor | 在面片的每個邊緣上定義鑲嵌數量。可用于在船體着色器中寫入和在域着色器中讀取。 | 浮動[2 | 3 | 4] |
SV_VertexID | 運作時自動生成的每個頂點辨別符(請參閱使用系統生成的值(Direct3D 10))。僅可用作頂點着色器的輸入。 | int |
SV_ViewportArrayIndex | 視口數組索引。應用于幾何着色器輸出,并訓示目前寫出的圖元要使用哪個視口。可以由像素着色器讀取。在将原語傳遞到栅格化器之前,将對其進行變換并根據索引指定的視口裁剪。此語義僅适用于基元。如果一個圖元具有多個頂點,則使用前導頂點的值。 如果D3D11_FEATURE_DATA_D3D11_OPTIONS3 :: VPAndRTArrayIndexFromAnyShaderFeedingRasterizer為true,則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及更高版本時,在轉換着色器時需要注意這一點。