unity 語義學習

 

語義學

語義是附加到着色器輸入或輸出的字符串,該字符串傳達有關參數的預期用途的信息。着色器階段之間傳遞的所有變量都需要語義。此處顯示了向着色器變量添加語義的語法(變量語法(DirectX HLSL)。

通常,流水線階段之間傳遞的數據是完全通用的,系統不會對其進行唯一解釋。允許沒有特殊含義的任意語義。包含這些特殊語義的參數(在Direct3D 10及更高版本中)稱爲系統值語義

Direct3D 9Direct3D 10及更高版本中支持的語義

Direct3D 9Direct3D 10及更高版本均支持以下類型的語義。

頂點着色器語義

這些語義在附加到頂點着色器參數時具有含義。Direct3D 9Direct3D 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和支持的資源數量之間的可選整數。例如,POSITION0TEXCOOR1等。

像素着色器語義

這些語義在附加到像素着色器輸入參數時具有含義。Direct3D 9Direct3D 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和支持的資源數量之間的可選整數。例如,PSIZE0COLOR1等。

COLOR語義僅在着色器兼容模式下有效(即,使用D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY創建着色器時)。

Direct3D 10和更高版本支持語義。

以下是針對Direct3D 10的新引入的語義類型,不適用於Direct3D 9

系統價值語義學

系統值語義是Direct3D 10的新增功能。所有系統值均以SV_前綴開頭,常見示例爲SV_POSITION,由光柵化程序階段解釋。系統值在管道的其他部分有效。例如,可以將SV_Position指定爲頂點着色器的輸入以及輸出。像素着色器只能寫入具有SV_DepthSV_Target系統值語義的參數。

其他系統值(SV_VertexIDSV_InstanceIDSV_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中,MultisampleEnableTRUE)並寫入深度值(使用像素着色器)時,寫入的單個值也用於深度測試;因此,在進行多重採樣時,將失去以更高的分辨率渲染原始邊緣的能力。
  • 使用動態流控制時,無法確定在編譯時是否可以保證在某些路徑中寫入SV_Depth的着色器在每次執行時都可以寫入SV_Depth。聲明時未能寫入SV_Depth會導致未定義的行爲(可能包括也可能不包括丟棄像素)。
  • 包括+/- INFNaN在內的任何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 VPOSDirect3D 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及更高版本時,在轉換着色器時需要注意這一點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章