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" //返回值
}

你可能感兴趣的:(UnityShader学习笔记—UnityShader结构)