unity-shaderテンプレートテスト-マスク


unity-shaderテンプレートテスト-マスク

じっけんこうか


シーン中の人物aは、見えないことを隠す、1つの平面bを用いて表示面、平面bが人物aと重なるとき、平面bの範囲内の人物aを表示する.

げんり

  • まず平面bを描画するとともに、テンプレートバッファを参照値1(Ref 1、値は任意)
  • に記入する.
  • 再描画人物aは、基準値を1とし、比較テンプレートバッファの基準値が同じであるから通過する.
  • 描画の前後順から分かるように、平面bのRenderQueue値<人物a.(大きいほど後に描画).shaderコード
  • 平面bに透明効果を加える


    平面bのRenderQueueは透明度タイプの上、3000とする.Alpha値を0にすればよい
    人物aは3000+であり、3001と仮定する
    効果

    shaderコード


    平面b上のshader-testStencilByMaskPlane.shader

    Shader "ITS/test/testStencilByMaskPlane" {
        Properties {
            _MainTex ("Base (RGB)", 2D) = "white" {}
            _MainColor ("Color", Color) = (1, 1, 1, 1)
        }
    
        SubShader {
            // Tags { "RenderType"="Transparent" }
            Tags {
        "Queue"="Transparent" "RenderType"="Transparent"}
            LOD 100
            Blend SrcAlpha OneMinusSrcAlpha 
    
            Pass {  
                Stencil
                {
                    Ref 1
                    Comp Always
                    Pass Replace
                    ZFail Replace
                }
    
                CGPROGRAM
                    #pragma vertex vert
                    #pragma fragment frag
                    #pragma multi_compile_fog
    
                    #include "UnityCG.cginc"
    
                    struct appdata_t {
                        float4 vertex : POSITION;
                        float2 texcoord : TEXCOORD0;
                    };
    
                    struct v2f {
                        float4 vertex : SV_POSITION;
                        half2 texcoord : TEXCOORD0;
                        UNITY_FOG_COORDS(1)
                    };
    
                    sampler2D _MainTex;
                    float4 _MainTex_ST;
                    float4 _MainColor;
    
                    v2f vert (appdata_t v)
                    {
                        v2f o;
                        o.vertex = UnityObjectToClipPos(v.vertex);
                        o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                        UNITY_TRANSFER_FOG(o,o.vertex);
                        return o;
                    }
    
                    fixed4 frag (v2f i) : SV_Target
                    {
                        fixed4 col = tex2D(_MainTex, i.texcoord);
                        col *= _MainColor;
                        UNITY_APPLY_FOG(i.fogCoord, col);
                        // UNITY_OPAQUE_ALPHA(col.a);
                        return col;
                    }
                ENDCG
            }
        }
    }
    

    人物a上のshader-testStencilByMaskChar.shader

    Shader "ITS/test/testStencilByMaskChar" {
        Properties {
            _MainTex ("Base (RGB)", 2D) = "white" {}
            _MainColor ("Color", Color) = (1, 1, 1, 1)
        }
    
        SubShader {
            Tags { "RenderType"="Opaque" }
            LOD 100
    
            Pass {  
                ZTest LEqual
                Stencil
                {
                    Ref 1
                    Comp Equal
                }
    
                CGPROGRAM
                    #pragma vertex vert
                    #pragma fragment frag
                    #pragma multi_compile_fog
    
                    #include "UnityCG.cginc"
    
                    struct appdata_t {
                        float4 vertex : POSITION;
                        float2 texcoord : TEXCOORD0;
                    };
    
                    struct v2f {
                        float4 vertex : SV_POSITION;
                        half2 texcoord : TEXCOORD0;
                        UNITY_FOG_COORDS(1)
                    };
    
                    sampler2D _MainTex;
                    float4 _MainTex_ST;
                    float4 _MainColor;
    
                    v2f vert (appdata_t v)
                    {
                        v2f o;
                        o.vertex = UnityObjectToClipPos(v.vertex);
                        o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                        UNITY_TRANSFER_FOG(o,o.vertex);
                        return o;
                    }
    
                    fixed4 frag (v2f i) : SV_Target
                    {
                        fixed4 col = tex2D(_MainTex, i.texcoord);
                        col *= _MainColor;
                        UNITY_APPLY_FOG(i.fogCoord, col);
                        UNITY_OPAQUE_ALPHA(col.a);
                        return col;
                    }
                ENDCG
            }
        }
    }