UnityShader之頂點片段着色器Vertex and Fragment Shader【Shader資料】


  頂點片段着色器

  V&F Shader:英文全稱Vertex and Fragment Shader,最強大的Shader類型,也是我們在使用ShaderLab中的重點部分,屬於可編程管線,使用的是CG/HLSL語法。分為vertex頂點部分和Fragment像素部分。

  本篇的末尾講述頂點函數傳入的結構體類型的參數appdata_base。

Shader "Custom/Exam1" {
    Properties {
    _MainTex ("Texture", 2D) = "white" { }   //引號里面的"Texture"則是Unity檢視面板中對應顯示的屬性名稱
    }
    SubShader
    {
        pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            sampler2D _MainTex;
            float4 _MainTex_ST;
            struct v2f {
                float4  pos : SV_POSITION;
                float2  uv : TEXCOORD0;
            } ;
            v2f vert (appdata_base v)
            {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP,v.vertex); //MVP矩陣變換,將裁剪空間坐標轉換為相對屏幕位置的UV坐標
                o.uv = TRANSFORM_TEX(v.texcoord,_MainTex); //TRANSFORM_TEX的作用是用頂點的UV v.texcoord和材質球的采樣圖片_MainTex做運算,確保頂點材質球里的縮放和偏移是正確的。 return o;
            }
            float4 frag (v2f i) : COLOR
            {
                float4 texCol = tex2D(_MainTex,i.uv);
                float4 outp = texCol;
                return outp;
            }
            ENDCG
        }
    }
}

  這里有一張圖片,直接山寨過來吧。

  

  頂點片段着色器,用文字描述永遠不及一張圖解。

 

  頂點函數傳入的結構體參數:

  只要引用UnityCg.cginc頭文件(目錄Unity > Editor > Data > CGIncludes下)就可以使用預先設定好的結構體直接使用,他們分別有appdata_base  appdata_tan和appdata_full:

  如下所示:

  注:頂點坐標和正切線為什么是float4,這有點意思,因為這里它表示是齊次坐標,比如我們這樣表示一個float4(x,y,z,w),當w = 1的時候它表示點(x,y,z),當w= 0的時候它表示一個向量(x,y,z)。區別就在這里,當W為1時表示點,當W為0時表示向量。

  texcoord0和texcoord1分別表示兩層UV,有時候我們模型上的貼圖需要多個圖片一起貼在一處,那么貼兩層就會有兩層UV,至於更多的層數,這里就不講了,因為更深入的筆者也並不是特別了解,當然學過美術的,對這個應該是非常的了解。

  以下三種類型為Unity內置的頂點Shader傳入結構體,如果想自定義也是可以的,但是自定義結構體里面的屬性,必須是基於appdata_full的,這樣才能識別出來,也就是自定義的結構里的屬性必須到appdata_full里的屬性里去選。

struct appdata_base {
    float4 vertex : POSITION; //頂點坐標
    float3 normal : NORMAL;//法線
    float4 texcoord : TEXCOORD0;//UV
};
struct appdata_tan {

    float4 vertex : POSITION;
    float4 tangent : TANGENT;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
};
struct appdata_full {
    float4 vertex : POSITION;//頂點坐標
    float4 tangent : TANGENT;//正切
    float3 normal : NORMAL;//法線
    float4 texcoord : TEXCOORD0;//第一層UV
    float4 texcoord1 : TEXCOORD1; //第二層UV
    fixed4 color : COLOR; //顏色
};

 


免責聲明!

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



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