1. 程式人生 > >unity shader 入門之路(四)Unity支援的語義

unity shader 入門之路(四)Unity支援的語義

從應用階段傳遞模型資料給頂點著色器時Unity支援的常用語義

語義 描述
POSITION 模型空間中的頂點位置,通常是float4型別
NORMAL 頂點法線,通常是float3型別
TANGENT 頂點切線,通常是float4型別
TEXCOORDn,如TEXCOORD0、TEXCOORD1 該頂點的紋理座標,TEXCOORD0表示第一組紋理座標,依此類推,通常是float2或float4型別
COLOR 頂點顏色,通常是fixed4或float4型別
其中TEXCOORDn中n的數目是和Shader Model有關的,例如一般在Shader Model 2(即Unity預設編譯到的Shader Model版本)和Shader Model 3中,n等於8,而在Shader Model 4和Shader Mode 5中,n等於16。通常情況下,一個模型的紋理座標組數一般不超過2,即我們往往只使用TEXCOORD0和TEXCOORD1。在Unity內建的資料結構體appdata_full中,它最多使用了6個座標紋理組。

從頂點著色器傳遞資料給片元著色器時Unity使用的常用語義

語義 描述
SV_POSITION 裁剪空間中的頂點座標,結構體中必須包含一個用該語義修飾的變數。等同於DirectX9中的POSITION,但最好使用SV_POSITION
COLOR0 通常用於輸出第一組頂點顏色,但不是必須的
COLOR1 通常用於輸出第二組頂點顏色,但不是必須的
TEXCOORD0~TEXCOORD7 通常用於輸出紋理座標,但不是必須的
上面的語義中,除了SV_POSITION是有特別含義外,其他語義對變數的含義沒有明確要求,也就是說,我們可以儲存任意值到這些語義描述變數中。通常,如果我們需要把一些自定義的資料從頂點著色器傳遞給片元著色器,一般選用TEXCOORD0等。

片元著色器輸出時Unity支援的常用語義

語義 描述
SV_Target 輸出值將會儲存到渲染目標(render target)中。等同於DirectX9中的COLOR語義,但最好使用SV_Target

定義複雜的變數型別

上面提到的語義絕大部分用於描述標量或向量型別的變數,例如fixed2、float、float4、fixed4等。下面的程式碼給出了一個使用語義來修飾不同型別變數的例子:

  1. struct v2f {
  2. float4 pos : SV_POSITION;
  3. fixed3 color0 : COLOR0;
  4. fixed4 color1 : COLOR1;
  5. half value0
    : TEXCOORD0;
  6. float2 value1 : TEXCOORD1;
  7. };
一個語義可以使用的暫存器只能處理4個浮點值(float)。因此,如果我們想要定義矩陣型別,如float3x4、float4x4等變數就需要使用更多的空間。一種方法是,把這些變數拆分成多個變數,例如對於float4x4的矩陣型別,我們可以用拆分成4個float4型別的變數,每個變數儲存了矩陣中的一行資料。