Unity-向頂點程序提供頂點數(shù)據(jù)
對于 Cg/HLSL?頂點程序,?網(wǎng)格頂點數(shù)據(jù)作為輸入傳遞給頂點 著色器函數(shù)。每個輸入都需要有指定的語義:例如,POSITION
?輸入表示頂點位置,NORMAL
?表示頂點法線。
通常,頂點數(shù)據(jù)輸入在結(jié)構(gòu)中聲明,而不是 逐個列出。在?UnityCG.cginc include 文件中 定義了幾個常用的頂點結(jié)構(gòu),在大多數(shù)情況下, 僅使用它們就足夠了。這些結(jié)構(gòu)為:
appdata_base
:位置、法線和一個紋理坐標(biāo)。appdata_tan
:位置、切線、法線和一個紋理坐標(biāo)。appdata_full
:位置、切線、法線、四個紋理坐標(biāo)和顏色。
示例:以下著色器根據(jù)法線為網(wǎng)格著色,并使用?appdata_base
?作為頂點程序輸入:
要訪問不同的頂點數(shù)據(jù),您需要自己聲明 頂點結(jié)構(gòu),或者將輸入?yún)?shù)添加到 頂點著色器。頂點數(shù)據(jù)由 Cg/HLSL?語義標(biāo)識,并且必須來自 以下列表:
POSITION
?是頂點位置,通常為?float3
?或?float4
。NORMAL
?是頂點法線,通常為?float3
。TEXCOORD0
?是第一個 UV 坐標(biāo),通常為?float2
、float3
?或?float4
。TEXCOORD1
、TEXCOORD2
?和?TEXCOORD3
?分別是第 2、第 3 和第 4 個 UV 坐標(biāo)。TANGENT
?是切線矢量(用于法線貼圖),通常為?float4
。COLOR
?是每頂點顏色,通常為?float4
。
當(dāng)網(wǎng)格數(shù)據(jù)包含的分量少于頂點著色器輸入所需 的分量時,其余部分用零填充,但默認(rèn)值為 1 的?.w
?分量除外。例如,網(wǎng)格紋理坐標(biāo) 通常是僅包含 x 和 y 分量的 2D 矢量。如果 頂點著色器使用?TEXCOORD0
?語義聲明一個?float4
?輸入,則 頂點著色器接收的值將包含 (x,y,0,1)。
示例
可視化 UV
以下著色器示例使用頂點位置和第一個紋理坐標(biāo)作為頂點著色器輸入(在結(jié)構(gòu)?appdata?中定義)。此著色器對于調(diào)試網(wǎng)格的 UV 坐標(biāo)非常有用。
在這里,UV 坐標(biāo)可視化為紅色和綠色,而另外的藍(lán)色色調(diào)已應(yīng)用于 0 到 1 范圍之外的坐標(biāo):
同樣,以下著色器可視化該模型的第二個 UV 集:
可視化頂點顏色
以下著色器使用頂點位置和每頂點顏色作為頂點著色器輸入(在結(jié)構(gòu)?appdata?中定義)。

可視化法線
以下著色器使用頂點位置和法線作為頂點著色器輸入(在結(jié)構(gòu)?appdata?中定義)。法線的 X、Y 和 Z 分量可視化為 RGB 顏色。由于法線分量在 –1 到 1 范圍內(nèi),我們對這些分量進行縮放和偏置,使輸出顏色可在 0 到 1 范圍內(nèi)顯示。


可視化切線和副法線
切線和副法線矢量用于法線貼圖。在 Unity 中,只有切線矢量存儲在頂點中,而副法線是從法線值和切線值中推導(dǎo)出的。

以下著色器使用頂點位置和切線作為頂點著色器輸入(在結(jié)構(gòu)?appdata?中定義)。切線的 x、y 和 z 分量可視化為 RGB 顏色。由于法線分量在 –1 到 1 范圍內(nèi),我們對這些分量進行縮放和偏置,使輸出顏色可在 0 到 1 范圍內(nèi)顯示。
以下著色器可視化副切線。它使用頂點位置、法線和切線值作為頂點輸入。副切線(有時稱為 副法線)是根據(jù)法線和切線值計算出的。它需要縮放并偏置到可顯示的 0 到 1 范圍內(nèi)。
