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

时间:2019-05-16 16:27:14

标签: unity3d shader stencil-buffer

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有什么方法吗?

Shape to make a hole in The hole punching shape Hierarchy

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

0 个答案:

没有答案