[Shader]顶点片元Shader


// shader名字
Shader "Unlit/001"
{
    // 属性块
    Properties
    {
        // 变量名 (unity面板显示的名字 类型) = 默认值
        _MainTex ("_MainTex", 2D) = "white" {} // 2d图片类型
        _Int("Int",Int) = 2                    // 整数类型
        _Float("Float",float) = 1.5            // 浮点类型
        _Range("Range",Range(0.0,2.0)) = 1.0   // 范围类型 限制数的范围
        _Color("Color",Color) = (0,0,0,0)      // 颜色类型
        _Vector("Vector",Vector) = (1,2,3,4)   // 四维数类型 例如矩阵会用到
        _Cube("Cube",Cube) = "white" {}        // Cube类型 一般天空盒会用
        _3D("3D",3D) = "black" {}              // 3D类型
    }

    // 可以包含多个,unity会根据平台自动选择第一个能运行的subshader
    // 如果都不能运行,会调用FallBack
    SubShader
    {
        // 标签 可选 key=value
        Tags 
        { 
            // 渲染顺序
            "Queue"="Transparent"
            // 渲染类型 着色器替换功能
            "RenderType"="Opaque" 
            // 是否进行合批
            "DisableBathching"="True"
            // 是否投射阴影
            "ForceNoShadowCasting"="True"
            // 是否受Projector影响,通常用于透明物体
            "IgnoreProjector"="True"
            // 是否用于图片的shader,通常用于UI
            "CanUseSpriteAltas"="False"
            // 用作shader面板预览的类型
            "PreviewType"="Plane"
        }

        // 渲染设置 可选,也可以写在pass通道里
        // Cull off/back/front 裁剪 off正反两面都渲染,back背面切掉渲染前面,front前面切掉渲染背面
        // ZTest Always // 深度测试 Always(总是)|Less Greater(小于)|LEqual(小于等于,默认)|GEqual(大于等于)|Equal(等)|NotEqual(不等)
        // ZWrite off // 深度写入 off/on
        // Blend SrcFactor DstFactor // 混合
        // LOD 100 // 不同情况下使用不同的LOD达到性能提升

        // 必须
        Pass
        {
            // Name "Default" // pass通道名称 可复用,复用时必须全大写
            
            //可以在每个pass通道里定义,如果外面也有,用外面的
            Tags
            {
                "LightMode"="ForwardBase" // 定义该pass通道在unity渲染流水中的角色
                //"RequrireOptions"="SoftVegetation" // 满足某些条件时才渲染该pass通道
            }

            // CG语言所写的代码,主要是顶点片元着色器
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }

    Fallback Off
}