如何防止在Unity中渲染地板平面下方的对象

问题描述 投票:1回答:1

我正在构建Unity AR Foundation项目,并且需要我的对象从地板下面显示。我需要放置一个将渲染阴影的地板平面,但更重要的是不渲染表面材质,并且应完全防止其下方的对象渲染。

我玩过一些Depth Mask Shaders,但没有一个起作用,只是渲染成一个大黑洞。

有人实现了吗?对于增强现实项目,这必须是一件普通的事情。

unity3d augmented-reality arkit arcore
1个回答
0
投票

我发现了两个着色器。一个用于在不可见的平面上制作阴影,另一个用于使不可见的平面遮盖住其下面的内容。

阴影着色器在这里:

Shader "AR/ARShadow"
{
    Properties
    {
        _ShadowColor("Shadow Color", Color) = (0.1, 0.1, 0.1, 0.53)
    }
        SubShader
    {
        Tags{ "RenderType" = "Transparent" "Queue" = "Geometry+1" }
        Blend SrcAlpha OneMinusSrcAlpha

        Pass
    {
        Tags{ "LightMode" = "ForwardBase" }

        CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fwdbase

#include "UnityCG.cginc"
#include "AutoLight.cginc" 

        struct appdata
    {
        float4 vertex : POSITION;
    };

    struct v2f
    {
        float4 pos : SV_POSITION;
        SHADOW_COORDS(2)
    };

    fixed4 _ShadowColor;

    v2f vert(appdata v)
    {
        v2f o;
        o.pos = UnityObjectToClipPos(v.vertex);
        TRANSFER_SHADOW(o);
        return o;
    }

    fixed4 frag(v2f i) : SV_Target
    {
        fixed atten = SHADOW_ATTENUATION(i);
    return fixed4(_ShadowColor.rgb,saturate(1 - atten)*_ShadowColor.a);
    }
        ENDCG
    }
    }
        FallBack "Diffuse"
}

这是遮挡着色器:

Shader "AR/Occlusion"
{
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        Tags { "Queue" = "Geometry-1" }
        ZWrite On
        ZTest LEqual
        ColorMask 0

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return fixed4(0.0, 0.0, 0.0, 0.0);
            }
            ENDCG
        }
    }
}

我现在要做的就是弄清楚如何合并两者。

:-)

© www.soinside.com 2019 - 2024. All rights reserved.