一、語義的解釋
語義,其實就是一個賦給Shader輸入和輸出的字符串,這個字符串表達了這個參數的含義。通俗的講
這些語義可以讓Shader知道從哪讀取輸送到哪里去,他們是在CG/HLSL的shader流水線中是不可避免。
表示圖元數據的含義(頂點的位置、法向量或者紋理信息),也表明這些圖元數據存放的硬件資源。
因為頂點着色器的輸出即是片段着色器的輸入,所以頂點着色器的輸出必須和片段着色器的輸入語義是
一致的。語義是頂點程序和片段程序之間輸入\輸出數據和寄存器之間的橋梁,因此語義只對這兩個處理
階段有意義,並且只在入口函數才有效,在內部函數無效。語義概念的提出和圖形流水線工作機制大有
關系。從前面所講的GPU 處理流程中可以看出,一個階段處理數據,然后傳輸給下一個階段,那么每個
階段之間的接口是如何確定的呢?例如:頂點處理器的輸入數據是處於模型空間的頂點數據(位置、法
向量),輸出的是投影坐標和光照顏色;片段處理器要將光照顏色做為輸入,問題是“片段處理器怎么知
道光照顏色值的存放位置”。在高級語言中(C/C++),數據從接口的一端流向另一端,是因為提供了數
據存放的內存位置(通常是指針信息);由於Cg 語言並不支持指針機制,且圖形硬件處理過程中,數據
通常暫存在寄存器中,故而在Cg 語言中,通過引入語義綁定(binding semantics)機制,指定數據存放
的位置,實際上就是將輸入\輸出數據和寄存器做一個映射關系(在OpenGL Cg profiles 中是這樣的,但
在DirectX-based Cgprofiles 中則並沒有這種映射關系)。根據輸入語義,圖形處理器從某個寄存器取數
據;然后再將處理好的數據,根據輸出語義,放到指定的寄存器。
二、從應用階段傳遞模型數據到頂點着色器時Unity經常使用的語義
語義 描述
POSITION 模型空間中模型頂點坐標位置,通常是float4類型
NORMAL 頂點法線,通常是float3類型
TANGENT 頂點切線,通常是float3類型
TEXCOORDn 頂點的紋理坐標,TEXCOORD0表示第一組紋理坐標以此類推,通常是float2或float4
COLOR 頂點的顏色,通常是float4或fixed4
三、從頂點着色器到片元着色器Unity經常使用的語義
語義 描述
SV_POSITION 裁剪空間中頂點坐標,結構體中必須有一個用該語義修飾的變量
等同於DirectX9中的POSITION,但最好使用SV_POSITION
COLOR0 通常用於修飾第一組頂點顏色,但不是必須的
COLOR1 通常用於修飾第二在頂點顏色,但不是必須的
TEXCOORD0~TEXCOORD7 通常用於修飾紋理坐標,但不是必須的
補充說明:這些語義除了SV_POSITION比較特殊以外,其他的語義基本上沒有明確的要求,
可以儲存任意數據到這些語義修飾的變量中。另外,通常我們習慣於用
TEXCOORD0來修飾自定義的變量。
四、片元着色器輸出時Unity支持的語義
SV_Target 等同於DirectX9中的COLOR,但我們最好用SV_Target。表示的是將輸出數據
傳遞給render_target(渲染目標)
DEPTH 片段的深度