UnityShader學習筆記—UnityShader結構

// 這里指定shader的名字,不要求跟文件名保持一致
Shader "Test/UnityShader結構"
{
    Properties
    {
        // 屬性 
        _Color("Color",Color)=(1,1,1,1) //float4
        _Vector("Vector",Vector)=(1,2,3,4) //float4
        _Int("Int",Int)= 34234 //float
        _Float("Float",Float) = 4.5 //float
        _Range("Range",Range(1,11))=6 //float
        _2D("Texture",2D) = "red"{} //sampler2D
        _Cube("Cube",Cube) = "white"{} //samplerCube
        _3D("Texure",3D) = "black"{} //sampler3D

        // 內部變量名("界面名稱",屬性類型)=屬性默認值; 
    }
    //SubShader(子著色器)可以寫很多個 顯卡運行效果的時候,從第一個SubShader開始,如果第一個SubShader里面的效果都可以實現,那么就使用第一個SubShader,如果顯卡這個SubShader里面某些效果它實現不了,它會自動去運行下一個SubShader
    SubShader
    {
        // 著色器修飾 硬件將通過判定這些標簽來決定什么時候調用該著色器。包括以下類型:
        // RenderType渲染方式
        // Opaque:不透明(法線、自發光、反射、地形Shader)
        // Transparent:半透明(透明、粒子、字體、地形添加通道Shader)
        // TransparentCutout:遮罩透明(透明裁切、雙通道植物Shader)
        // Background:天空盒Shader
        // Overlay:GUI紋理、光暈、閃光Shader
        // TreeOpaque:地形引擎——樹皮
        // TreeTransparentCutout:地形引擎——樹葉
        // TreeBillboard:地形引擎——公告牌(始終面向攝像機)式樹木
        // Grass:地形引擎——草
        // GrassBillboard:地形引擎——公告牌(始終面向攝像機)式草
        // Queue 指定渲染順序隊列: 
        // Background 通常用于SkyBox; 
        // Geometry 最常用的一種,用來渲染非透明物體(普通情況下,場景中的絕大多數物體應該是非透明的) 
        // AlphaTest - 用來渲染經過Alpha Test的像素,單獨為AlphaTest設定一個Queue是出于對效率的考慮 
        // Transparent 以從后往前的順序渲染透明物體 
        // Overlay 用來渲染疊加的效果,是渲染的最后階段(比如鏡頭光暈等特效)
        // “ForceNoShadowCasting”=”True” 從不產生陰影
        Tags { "RenderType"="Opaque" }
        // LOD是Level of Detail的縮寫,在這里例子里我們指定了其為200(其實這是Unity的內建Diffuse著色器的設定值)。這個數值決定了我們能用什么樣的Shader。
        // VertexLit及其系列 = 100 
        // Decal, Reflective VertexLit = 150 
        // Diffuse = 200 
        // Bumped VertexLit = 250 
        // Bumped, Specular = 300 
        // Bumped Specular = 400 
        // Parallax = 500 
        // Parallax Specular = 600   
        LOD 100
        //至少有一個Pass
        Pass
        {
            // 這里還會標注RenderState.設定顯示各種狀態: 
            // Cull ( Back,Front,Off) 設置多邊形剔除模式 
            // ZTest (Less,Greater,LEqual,GEqua,Equal,NotEqual,Always) 默認是LEqual. 
            // ZWrite (On,Off) 設置深度寫模式,是否此物體的像素深度會被記錄(默認記錄) Off,通常用于半透明物體。 
            // AlphaTest(Less,Greater,LEqual,GEqual,Equal,NotEqual,Always) 開啟alpha測試 
            // Blend SourceB./endMode DestB/endMode 設置alpha混合模式。(以下為相關屬性說明) 
            // One 值為1,使用此設置來讓源或是目標顏色完全的通過。 
            // Zero 值為0 ,使用此設置來刪除源或目標值。 
            // SroColor 此階段的值是乘以源顏色的值。 
            // SrcAlpha 此階段的值是乘以源alpha的值。 
            // DstColor 此階段的值是乘以幀緩沖區源顏色的值。 
            // DstAlpha 此階段的值是乘以幀緩沖區源alpha的值。 
            // OneMinusSrcColor 此階段的值是乘以(1-source color) 
            // OneMinusSrcAlpha 此階段的值是乘以(1-source alpha) 
            // OneMinusDstColor 此階段的值是乘以(1-destination color) 
            // OneMinusDstAlpha 此階段的值是乘以(1-destination alpha)


            //在這里編寫shader代碼  HLSLPROGRAM
            CGPROGRAM//使用CG語言編寫shader代碼
            // 聲明一個以vert為名字的函數的頂點程序 
            #pragma vertex vert
            // 聲明一個以frag為名字的函數的片元程序。
            #pragma fragment frag
            // 可選
            // #pragma surface name 聲明一個以name為名字的函數表面shader; 
            // #pragma vertex name 聲明一個個以name為名字的函數的頂點程序 
            // #pragma fragment name- 聲明一個個以name為名字的函數的片段程序。 
            // #pragma fragmentoption option - 添加選項到編譯的OpenGL 片段程序。 通過 ARB 片段程序 可以查詢到所允許的規范的選項列表。 這個指令對頂點程序或者不是以OpenGL為編譯目標的程序無效。 
            // #pragma target name -著色器目標編譯。詳情請參考 著色器目標。 
            // #pragma only_renderers space separated names - 僅用給定的渲染器編譯著色器。默認情況下用所有的渲染器都編譯著色器。 
            // #pragma exclude_renderers space separated names -不用給定的渲染器編譯著色器。 默認情況下用所有的渲染器都編譯著色器。 
            // #pragma glsl - 用桌面OpenGL平臺編譯著色器時,轉換成GLSL里面的Cg/HLSL(而不是默認設置的ARB頂點/片段程序)。

            // #pragma surface surf Standard fullforwardshadows 
            // Use shader model 3.0 target, to get nicer looking lighting 
            // #pragma target 3.0 //編譯著色器模式3.0


            // Mac上的位置 /Applications/Unity/Unity.app/Contents/CGIncludes
            // Win上的位置 Unity的安裝路徑/Data/CGIncludes
            #include "UnityCG.cginc"

            // 結構體
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };
            // 結構體
            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            // 頂點入口函數
            v2f vert (appdata v)
            {
                v2f o;
                // 內置函數http://blog.csdn.net/qingshui37/article/details/51476404
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }
            // 片元入口函數
            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                
                return col;
            }
            // 結束CG程序
            ENDCG
        }
    }
    Fallback "VertexLit" //返回值
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容