語意

語意是附加至著色器輸入或輸出的字串,可傳達參數預期用途的相關信息。 著色器階段之間傳遞的所有變數都需要語意。 將語意新增至著色器變數的語法如下所示(變數語法(DirectX HLSL)

一般而言,在管線階段之間傳遞的數據是完全泛型的,而且不會由系統唯一解譯;允許具有特殊意義的任意語意。 包含這些特殊語意的參數(在 Direct3D 10 和更新版本中),稱為 「系統值語意」

Direct3D 9 和 Direct3D 10 和更新版本中支持的語意

Direct3D 9 和 Direct3D 10 和更新版本中都支援下列類型的語意。

頂點著色器語意

這些語意在附加至頂點著色器參數時具有意義。 Direct3D 9 和 Direct3D 10 和更新版本中都支持這些語意。

輸入 描述 類型
BINORMAL[n] Binormal float4
BLENDINDICES[n] 混合索引 uint
BLENDWEIGHT[n] 混合權數 float
COLOR[n] 擴散和反射色彩 float4
NORMAL[n] 一般向量 float4
POSITION[n] 對象空間中的頂點位置。 float4
POSITIONT 轉換的頂點位置。 float4
PSIZE[n] 點大小 float
TANGENT[n] 切線 float4
TEXCOORD[n] 紋理座標 float4
輸出 描述 類型
COLOR[n] 擴散或反射色彩 float4
頂點霧 float
POSITION[n] 同質空間中頂點的位置。 將螢幕空間中的計算位置除以 w(x,y,z) 每個頂點著色器都必須寫出具有此語意的參數。 注意:此語意適用於 Direct3D 9。 針對 Direct3D 10 和更新版本,請改用 SV_Position。 float4
PSIZE 點大小 float
TESSFACTOR[n] 鑲嵌因數 float

n 是介於 0 與支援的資源數目之間的選擇性整數。 例如,POSITION0、TEXCOORD1等。

圖元著色器語意

這些語意在附加至圖元著色器輸入參數時具有意義。 Direct3D 9 和 Direct3D 10 和更新版本中都支持這些語意。

輸入 描述 類型
COLOR[n] 擴散或反射色彩。 float4
TEXCOORD[n] 紋理座標 float4
VFACE 表示背向基本類型的浮點純量。 負值會向後顯示,而正值則面對相機。

注意
此語意適用於 Direct3D 9 著色器模型 3.0。 針對 Direct3D 10 和更新版本,請改用 SV_IsFrontFace


float
VPOS 屏幕空間中的圖元位置 (x,y)。 若要將 Direct3D 9 著色器(使用此語意)轉換為 Direct3D 10 和更新版本的著色器,請參閱 Direct3D 9 VPOS 和 Direct3D 10 SV_Position float2
輸出 描述 類型
COLOR[n] 輸出色彩 float4
DEPTH[n] 輸出深度 float

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是這個規則的例外狀況,即只輸入管線中第一個作用中著色器,而該著色器可以解譯特定值;硬體可以提供與船體著色器階段、網域著色器階段以及在該之後第一個啟用階段相同的標識符值:geometry-Shader 階段或圖元著色器階段。

如果已啟用鑲嵌式,則會出現船體著色器階段和領域著色器階段。 針對指定的修補程式,相同的 PrimitiveID 會套用至修補程式的輪廓著色器調用,以及所有鑲嵌式網域著色器調用。 相同的 PrimitiveID 也會傳播到下一個使用中階段;如果已啟用 geometry-shader 階段或像素著色器階段。

如果幾何著色器輸入SV_PrimitiveID,而且因為它可以為每個調用輸出零或一或多個基本類型,著色器必須在後續的圖元著色器輸入SV_PrimtiveID時,針對每個輸出基本類型自行撰寫SV_PrimitiveID值的程序設計。

另一個範例是,頂點著色器階段無法解譯SV_PrimitiveID,因為頂點可以是多個基本類型的成員。

這些語意已新增至 Direct3D 10;它們無法在 Direct3D 9 中使用。

轉譯器階段的系統值語意。

系統值語意 描述 類型
SV_ClipDistance[n] 裁剪距離數據。 SV_ClipDistance值都是假設為平面的 float32 帶正負號距離。 基本設定只會在插入平面距離 >= 0 的像素上叫用點陣化。 您可以同時實作多個裁剪平面,方法是將一個或多個頂點元素的多個元件宣告為SV_ClipDistance。 在最多 D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT 緩存器中,結合的剪輯和 cull 距離值最多為 D3D#_CLIP_OR_CULL_DISTANCE_COUNT 元件。 可供讀取或寫入的所有著色器使用,但頂點著色器可以寫入值,但無法將其視為輸入。
clipplanes 屬性的運作方式類似SV_ClipDistance,但適用於所有硬體功能層級9_x和更新版本 如需詳細資訊,請參閱 功能層級 9 硬體上的使用者剪輯平面。
float
SV_CullDistance[n] Null 距離數據。 當頂點元素的 component(s) 指定此標籤時,這些值會假設為平面的 float32 帶正負號距離。 如果基本類型中所有頂點的平面距離為 < 0,則會完全捨棄基本類型。 您可以將一或多個頂點元素的多個元件宣告為SV_CullDistance,以同時使用多個 null 平面。 在最多 D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT 緩存器中,結合的剪輯和 cull 距離值最多為 D3D#_CLIP_OR_CULL_DISTANCE_COUNT 元件。 可供讀取或寫入的所有著色器使用,但頂點著色器可以寫入值,但無法將其視為輸入。
float
SV_Coverage 可在輸入、輸出或兩個像素著色器上指定的遮罩。
針對圖元著色器上的SV_Coverage,ps_4_1或更新版本支援 OUTPUT。
針對圖元著色器上的SV_Coverage,INPUT 需要ps_5_0或更高版本。
uint
SV_Depth 深度緩衝區數據。 可由圖元著色器撰寫。 float
SV_DepthGreaterEqual 在圖元著色器中,允許輸出深度,只要其大於或等於轉譯器所決定的值即可。 啟用調整深度,而不停用早期 Z。 float
SV_DepthLessEqual 在圖元著色器中,允許輸出深度,只要小於或等於轉譯器所決定的值即可。 啟用調整深度,而不停用早期 Z。 float
SV_DispatchThreadID 定義分派呼叫內的全域線程位移,每個群組維度。 可作為計算著色器的輸入。 (唯讀) uint3
SV_DomainLocation 定義要評估之目前定義域點殼體上的位置。 可作為網域著色器的輸入。 (唯讀) float2|3
SV_GroupID 定義分派呼叫內的群組位移,每個分派呼叫的維度。 可作為計算著色器的輸入。 (唯讀) uint3
SV_GroupIndex 提供指定群組內指定線程的扁平化索引。 可作為計算著色器的輸入。 (唯讀) uint
SV_GroupThreadID 定義群組內每個維度的線程位移。 可作為計算著色器的輸入。 (唯讀) uint3
SV_GSInstanceID 定義 geometry 著色器的實例。 可作為幾何著色器的輸入。 需要實例,因為幾何著色器最多可以在相同的幾何基本類型上叫用 32 次。 uint
SV_InnerCoverage 代表低估的保守點陣化資訊(即圖元是否保證完全涵蓋)。 可由圖元著色器讀取或寫入。
SV_InsideTessFactor 定義修補表面內的鑲嵌量。 可在船體著色器中取得以供寫入,且可在網域著色器中取得以供讀取。 float|float[2]
SV_InstanceID 執行時間自動產生的每個實體識別碼(請參閱 使用系統產生的值 (Direct3D 10) 。 適用於所有著色器。
SV_IsFrontFace 指定三角形是否為正面。 針對線條和點,IsFrontFace 的值為 true。 例外狀況是繪製出三角形的線條(線框模式),這會將IsFrontFace設定為與以實心模式點陣化三角形的方式相同。 可由幾何著色器寫入,並由圖元著色器讀取。 bool
SV_OutputControlPointID 定義由船體著色器主要進入點叫用所操作之控制點標識碼的索引。 只能由船體著色器讀取。 uint
SV_Position 當SV_Position宣告為著色器的輸入時,它可以有兩種指定的插補模式之一:linearNoPerspective 或 linearNoPerspectiveCentroid,其中後者會在多重取樣反鋸齒時提供心心貼齊的 xyzw 值。 在著色器中使用時,SV_Position描述圖元位置。 適用於所有著色器,以取得具有0.5位移的圖元中心。 float4
SV_PrimitiveID 執行時間自動產生的每一基本識別碼(請參閱 使用系統產生的值 (Direct3D 10) 。 可以由幾何或像素著色器寫入,並由幾何、圖元、殼體或領域著色器讀取。 uint
SV_RenderTargetArrayIndex 轉譯目標陣列索引。 套用至幾何著色器輸出,並指出基本類型將由圖元著色器繪製的轉譯目標陣列配量。 只有當轉譯目標是陣列資源時,SV_RenderTargetArrayIndex才有效。 此語意僅適用於基本類型;如果基本類型有多個頂點,則會使用前置頂點的值。 這個值也會指出深度/樣板檢視的數位配量用於讀取/寫入目的。
可以從幾何著色器寫入,並由圖元著色器讀取。
如果 D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizertrue,則SV_RenderTargetArrayIndex會套用至任何向轉譯器饋送的著色器。
uint
SV_SampleIndex 取樣頻率索引數據。 只能由圖元著色器讀取或寫入。 uint
SV_StencilRef 表示目前的像素著色器樣板參考值。 只能由圖元著色器撰寫。 uint
SV_Target[n],其中 0 <= n <= 7 將儲存在轉譯目標的輸出值。 索引表示要寫入的8個可能系結轉譯目標中的哪一個。 值可供所有著色器使用。 float[2|3|4]
SV_TessFactor 定義修補的每個邊緣的鑲嵌量。 可用於在船體著色器中寫入,並在網域著色器中讀取。 float[2|3|4]
SV_VertexID 運行時間自動產生的每個頂點標識碼(請參閱 使用系統產生的值 (Direct3D 10) )。 僅供頂點著色器的輸入使用。 uint
SV_ViewportArrayIndex Viewport 陣列索引。 套用至幾何著色器輸出,並指出要用於目前正在寫出之基本類型的檢視區。圖元著色器可以讀取。 在將索引指定的檢視區傳遞至轉譯器之前,會先轉換和裁剪基本類型。 此語意僅適用於基本類型;如果基本類型有多個頂點,則會使用前置頂點的值。
如果 D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizertrue,則會將SV_ViewportArrayIndex套用至轉譯器饋送的任何著色器。
uint
SV_ShadingRate 透過底紋速率 定義由一個像素著色器調用寫入的像素數目,以 可變底紋速率第2 層或更高層級的裝置。 可以從圖元著色器讀取。 可以從頂點或幾何著色器撰寫。 uint

撰寫SV_Depth時的限制:

  • 當多重取樣 (multisampleEnable 在 D3D10_RASTERIZER_DESCTRUE)和寫入深度值(使用圖元著色器),則寫出的單一值也會用於深度測試中,因此在較高解析度呈現基本邊緣的能力會在多重取樣時遺失。
  • 使用動態流程控制時,不可能在編譯時期判斷是否保證在一些路徑中寫入SV_Depth的著色器是否保證會在每次執行中寫入SV_Depth。 當宣告時無法寫入SV_Depth會導致未定義的行為(這可能或不包括捨棄圖元)。
  • 任何 float32 值,包括 +/-INF 和 NaN 都可以寫入至SV_Depth。
  • 執行雙重來源色彩混合時,寫入SV_Depth仍然有效。

從 Direct3D 9 移轉至 Direct3D 10 和更新版本

將程式代碼從 Direct3D 9 移轉至 Direct3D 10 和更新版本時,應考慮下列問題:

對應至 Direct3D 9 語意

一些 Direct3D 10 和更新版本的語意會直接對應至 Direct3D 9 語意。

Direct3D 10 語意 Direct3D 9 對等語意
SV_Depth DEPTH
SV_Position POSITION
SV_Target 顏色

[!]請注意 Direct3D 9 開發人員:針對 Direct3D 9 目標,著色器語意必須對應至有效的 Direct3D 9 語意。 為了回溯相容性,FXC 會將POSITION0及其變體名稱視為SV_Position。 FXC 會將 COLOR 視為SV_TARGET。 DXC 和較新的編譯程式會將POSITION[n] 和 COLOR 視為使用者定義的語意。

Direct3D 9 VPOS 和 Direct3D 10 SV_Position

D3D10 語意SV_Position提供與 Direct3D 9 著色器模型 3 VPOS 語意類似的功能。 例如,在 Direct3D 9 中,下列語法用於使用螢幕空間座標的圖元著色器:

float4 psMainD3D9( float4 screenSpace : VPOS ) : COLOR
{
    // code here 
}

VPOS 新增了著色器模型 3 支援,以指定螢幕空間座標,因為 POSITION 語意適用於物件空間座標。

在 Direct3D 10 和更新版本中,SV_Position語意(在圖元著色器的內容中使用時)會指定螢幕空間座標(位移 0.5)。 因此,Direct3D 9 著色器大致相當於下列專案(而不考慮 0.5 位移):

float4 psMainD3D10( float4 screenSpace : SV_Position ) : COLOR
{
    // code here
}

從 Direct3D 9 移轉至 Direct3D 10 和更新版本時,您必須在翻譯著色器時注意這一點。

HLSL 中的使用者裁剪平面

從 Windows 8 開始,您可以在 HLSL 函式宣告中使用剪輯平面函式屬性,而不是SV_ClipDistance,讓您的著色器在功能層級9_x以及功能層級 10 和更新版本上運作。 如需詳細資訊,請參閱 功能層級 9 硬體上的使用者剪輯平面。