Unity Shader (六)模板测试(Stencil)

模板测试的作用:对像素进行一个全方位的输出控制,这句话是我自己的理解。为什么叫全方位的呢?

why?? 我们不是有深度测试 和 alpha测试了吗。

  1. 想想Alpha测试,他针对的是alpha值,而alpha值是美术的图片控制的,有些场合你alpha值不透明但是你还是想他透明,就不好办了。
  2. 再想想深度测试,他针对的是摄像机的深度,你可以通过渲染队列,以及融合来更改渲染顺序,但是仍然达不到随心所欲的渲染控制。

这里先上一张用模板测试的例子

Game视图
Unity Shader (六)模板测试(Stencil)_第1张图片

Scene视图
Unity Shader (六)模板测试(Stencil)_第2张图片

要实现这个模型遮罩的效果其实很简单,我们只需要让钥匙模型的像素不通过模板测试即可

Shader "SoulCoder/Model" {
    Properties {
        _Color ("Main Color", Color) = (1,1,1,0)
    }
    SubShader {
        Tags { "RenderType"="Opaque" "Queue"="Geometry+2"}

        ColorMask RGB
        Cull Front
        ZTest Always
        Stencil {
            Ref 0
            Comp Equal 
        }

        CGPROGRAM
        #pragma surface surf Lambert
        float4 _Color;
        struct Input {
            float4 color : COLOR;
        };
        void surf (Input IN, inout SurfaceOutput o) {
            o.Albedo = _Color.rgb;
            o.Normal = half3(0,0,-1);
            o.Alpha = 1;
        }
        ENDCG
    } 
}

//遮罩   
Shader "SoulCoder/Mask" {
    SubShader {
        Tags { "RenderType"="Opaque" "Queue"="Geometry+1"}
        ColorMask 0
        ZWrite off
        Stencil {
            Ref 1
            Comp always
            Pass replace
        }

        CGINCLUDE
            struct appdata {
                float4 vertex : POSITION;
            };
            struct v2f {
                float4 pos : SV_POSITION;
            };
            v2f vert(appdata v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                return o;
            }
            half4 frag(v2f i) : SV_Target {
                return half4(1,1,0,1);
            }
        ENDCG

        Pass {
            Cull Front
            ZTest Less

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            ENDCG
        }
        Pass {
            Cull Back
            ZTest Greater

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            ENDCG
        }
    }}

打个小广告 欢迎加入独立游戏开发

你可能感兴趣的:(unity3d,(手机网游开发问题总结))