首页 > 解决方案 > Unity 3D HDRP - 通过着色器使用模板在游戏对象中打孔

问题描述

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

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

        ColorMask RGB
        ZWrite On

        Stencil {
            Ref 1
            Comp notequal
            Pass Zero
        }

        Pass{}
    }
}

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

有没有办法在 HDRP 中做到这一点?

形状以在其中打孔 打孔形状 等级制度

注意:我还在我的 HDRP 项目中尝试了通过脚本和着色器的渲染队列方法,但没有成功,尽管相同的代码适用于标准的统一项目。

标签: unity3dshaderstencil-buffer

解决方案


推荐阅读