天天看點

unity 語義學習

語義學

語義是附加到着色器輸入或輸出的字元串,該字元串傳達有關參數的預期用途的資訊。着色器階段之間傳遞的所有變量都需要語義。此處顯示了向着色器變量添加語義的文法(變量文法(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及更高版本時,在轉換着色器時需要注意這一點。

U3D