Unity 3D HDRP-使用模具通过着色器在游戏对象中打洞

Mad*_*s M 8 shader stencil-buffer unity-game-engine

Unity版本2019.1.2f1 HDRP项目。

我试图在一个完成的游戏对象上打个洞,该对象具有不想干扰的材质和着色器,要点是,它应该与完成的任何对象一起工作。我在其他地方找到了这种方法,但似乎不适用于HD Render Pipeline版本。基本上,要在要打洞的地方放置两个额外的游戏对象/形状,一个对象具有准备阶段,另一个则可以打孔。

着色器示例:

Shader "Custom/HolePrepare" {
    Properties{
    }

    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
        }
    }   
}
Run Code Online (Sandbox Code Playgroud)

Shader "Custom/Hole" {
    Properties{
    }
    SubShader{
        Tags{ "Queue" = "Geometry+10" }

        ColorMask RGB
        ZWrite On

        Stencil {
            Ref 1
            Comp notequal
            Pass Zero
        }

        Pass{}
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这些值在理论上是不正确的,因为这不是示例代码的方式,但是由于它不适用于HDRP,因此我开始四处寻找并查看是否有任何问题。孔着色器应具有ColorMask RGB 0,但是除了孔对象不可见以外,什么也不会发生。这使我相信我无法正确使用模板缓冲区。我到达可以标记要删除的像素的地步,但是我无法删除它们。我希望能够擦除主要对象(奶酪)的这一部分,以使背景(在这种情况下为地板)可见。

HDRP有什么办法吗?

形状上打孔 冲孔形状 层次结构

注意:我也尝试了在HDRP项目中使用脚本和着色器进行渲染队列的方法,但是没有成功,尽管相同的代码在标准的unity项目中也有效。