SubShader
{
    // 标签项 可选 key = value
    Tags 
    {
        "Queue" = "Transparent" // 渲染顺序
        "RenderType" = "Opaque" // 着色器替换功能
        "DisableBatching" = "True" // 是否进行合批
        "ForceNoShadowCasting" = "True" // 是否投射阴影
        "IgnoreProjector" = "True" // 受不受 Projector 的影响,通常用于透明物体
        "CanUseSpriteAltas" = "False" // 是否用于图片的 Shader,通常用于 UI
        "PreviewType" = "Plane" // 用于 Shader 面板预览的类型
    }
    // Render 设置 可选
    //Cull off/back/front  // 选择渲染那个面
    //ZTest Always/Less Greater/LEqual/GEqual/Equal/NotEqual  // 深度测试
    //Zwrite off/on   // 深度写入
    //Blend SrcFactor DstFactor   // 混合
    //LOD 100  // 不同情况下使用不同的 LOD,达到性能提升
    // 必须
    Pass
    {
        //Name "Default" // Pass 通道名称
        // Tags 还可以在每个 Pass 通道里面进行定义,属性重复以外层的为准
        Tags 
        {
            "LightMode" = "ForwardBase" // 定义该 Pass 通道在 Unity 渲染流水中的角色
            //"RequireOptions" = "SoftVegetation" // 满足某些条件时才渲染该 Pass 通道
        } 
        // Render 设置 可以在每个 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
    }
}