Unity Sahder 語法及注意事項

Unity Shader語法

Unity Sahder 包括固定着色器、表面着色器、可編程着色器(頂點着色器、表面着色器),這裏只討論可編程着色器,同時便於自己寫shader時查閱,防止忘記。


首先列出可編程着色器的基本框架(以一半透明着色器爲例):

//爲自己的shder起名字,前面爲目錄結構
Shader "MyShader/Transparent" {

    //屬性:即可在unity面板上設置的一些變量
    Properties {

        //主紋理
        _MainTex ("Texture", 2D) = "white" {}

        //顏色
        _AmbientCol ("AmbientCol", color) = (0.0, 0.0, 0.0, 0.0) 
        _DiffuseCol ("DiffuseCol", color) = (0.0, 0.0, 0.0, 0.0)

        //光向量
        _LightDir ("LightDir", vector) = (0.0, 1.0, 0.0, 0.0)
    }

    //子着色器,可以有多個,根據設備選擇合適的着色器
    SubShader {

        //標籤,可有多個;包含渲染隊列,渲染類型等標籤
        Tags{ "Queue" = "Transparent"}

        //渲染通道,可有多個,根據需要渲染的次數來添加
        Pass
        {

            //關閉深度寫入
            ZWrite Off

            //Alpha混合方式
            Blend  SrcAlpha OneMinusSrcAlpha  

            //CG語言模塊,所以說要會Cg語言纔會編寫可編程着色器
            CGPROGRAM
            #pragma vertex vert     //定義頂點着色器入口
            #pragma fragment frag   //定義片段着色器入口

            #include "UnityCG.cginc"        //包含該模塊,使用內置的Cg函數

            //定義頂點着色器入口的結構體
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float3 normal : NORMAL;
            };

            //定義頂點着色器輸入到片段着色器的結構體
            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
                float4 color : TEXCOORD1;
            };

            //着色器中使用的外部變量
            uniform sampler2D _MainTex;

            uniform float4 _AmbientCol;
            uniform float4 _DiffuseCol;

            uniform float4 _LightDir;

            //頂點着色器
            v2f vert (appdata v) : SV_POSITION
            {
                v2f o;
                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); //計算投影后的座標
                o.color = _DiffuseCol * dot(normalize(v.normal), normalize(_LightDir)); 
                o.uv = v.uv;
                return o;
            }

            //片段着色器
            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                col *= i.color;
                col += _AmbientCol + float4(0.0, 0.0, 0.0, 0.5);
                return col;
            }
            ENDCG
        }
    }

    //默認着色器,當自定義着色器不能運行時,運行該着色器
    FallBack "Diffuse"
}

注意事項

此處使用”ZWrite Off;”是因爲此處渲染的爲透明物體,如果不關閉深度緩存寫入,此透明物體就會覆蓋後面的物體,而不是跟後面的物體混合!
所以說,透明物體一定要在後面的物體渲染過後渲染,並且要關閉深度寫入

  • 關於CG中的語義POSITION與SV_POSITION的區別,推薦這篇文章
  • 關於屬性變量選擇可以看着張圖片(來自馮樂樂的Unity Shader入門精要)unity屬性類型與CG變量類型

有問題歡迎大家拍磚,畢竟我也還在學習中,會後續更新其它注意事項以及其它需要查閱的東西

Reference:
1.Unity Shader入門精要 馮樂樂.pdf
2.http://blog.csdn.net/zhao_92221/article/details/46797969

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章