1. 程式人生 > >Unity Shader (六)模板測試(Stencil)

Unity Shader (六)模板測試(Stencil)

模板測試的作用:對畫素進行一個全方位的輸出控制,這句話是我自己的理解。為什麼叫全方位的呢?

why?? 我們不是有深度測試 和 alpha測試了嗎。

  1. 想想Alpha測試,他針對的是alpha值,而alpha值是美術的圖片控制的,有些場合你alpha值不透明但是你還是想他透明,就不好辦了。
  2. 再想想深度測試,他針對的是攝像機的深度,你可以通過渲染佇列,以及融合來更改渲染順序,但是仍然達不到隨心所欲的渲染控制。

這裡先上一張用模板測試的例子

Game檢視
這裡寫圖片描述

Scene檢視
這裡寫圖片描述

要實現這個模型遮罩的效果其實很簡單,我們只需要讓鑰匙模型的畫素不通過模板測試

即可

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 } }}

打個小廣告 歡迎加入獨立遊戲開發