【Unity Shader】二、頂點函數(vertex)和片元函數(fragment)傳遞數據,及各階段可使用的語義(semantic)


學習資料:http://www.sikiedu.com/course/37/task/433/show


本節學習目標:

  • 學習Shader中結構體struct的使用。
  • 學習在片元函數(vertex)和頂點函數(fragment)之間傳遞數據。
  • 學習從應用程序傳遞到頂點函數(a2v)、從頂點函數傳遞到片元函數(v2f)、從片元函數傳遞回系統(f2a)時,各個階段中可以使用的語義。
Shader "Custom/02" {
    SubShader{
        Pass {
            CGPROGRAM

#pragma vertex vert
#pragma fragment frag

            struct a2v // 命名表示從應用程序傳遞到頂點函數,application to vertex
            {
                float4 vertex : POSITION;    // 告訴Unity把模型空間下的頂點坐標填充給vertex屬性
                float3 normal : NORMAL;      // 告訴Unity把模型空間下的法線方向填充給normal屬性
                float4 texcoord : TEXCOORD0; // 告訴Unity把第一套紋理坐標填充給texcoord屬性
            };

            struct v2f // 命名表示從頂點函數傳遞到片元函數,vertex to fragment
            {
                float4 position : SV_POSITION;
                float3 temp : COLOR0; // 屬性必須指定語義。該語意可以由用戶自定義,一般用於存儲顏色
            };

            // 計算頂點坐標從模型坐標系轉換到裁剪面坐標系
            v2f vert(a2v v)
            {
                v2f f;
                f.position = mul(UNITY_MATRIX_MVP, v.vertex);
                f.temp = v.normal;
                return f; // 使用結構體struct就可以一次返回多個數據
            }

            // 計算每個像素點的顏色值
            fixed4 frag(v2f f) : SV_Target 
            {
                return fixed4(f.temp, 1); // f.temp是float3已經包含了三個數值
            }

            ENDCG
        }
        
    }
    FallBack "Diffuse"
}

最終顯示的顏色值是每個像素點的法線方向的顏色值。參考右上角的世界坐標。

 


從應用程序傳遞到頂點函數(a2v)時,可以使用的語義:

  • POSITION 頂點坐標(模型空間)
  • NORMAL 法線(模型空間)
  • TANGENT 切線(模型空間)
  • TEXCOORD(0~n) 紋理坐標。x、y從0到1
  • COLOR 頂點顏色 

從頂點函數傳遞給片元函數(v2f)時,可以使用的語義:

  • SV_POSITION 頂點坐標(剪裁空間),一般是系統直接使用
  • COLOR0 可以傳遞一組值(4個)
  • COLOR1 可以傳遞一組值(4個)
  • TEXCOORD(0~7) 傳遞紋理坐標

從片元函數傳遞回系統(f2a)時,可以使用的語義:

  • SV_TARGET 顏色值,顯示到屏幕上的顏色

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM