防止投影着色器遮挡透明区域

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

我正在尝试使用Decal着色器与Unity中的投影仪一起使用。这是我把它放在一起的东西:

Shader "Custom/color_projector"
{
    Properties {
        _Color ("Tint Color", Color) = (1,1,1,1)
        _MainTex ("Cookie", 2D) = "gray" {}
    }
    Subshader {
        Tags {"Queue"="Transparent"}

        Pass {

            ZTest Less
            ColorMask RGB
            Blend One OneMinusSrcAlpha
            Offset -1, -1

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct v2f {
                float4 uvShadow : TEXCOORD0;
                float4 pos : SV_POSITION;
            };

            float4x4 unity_Projector;
            float4x4 unity_ProjectorClip;

            v2f vert (float4 vertex : POSITION)
            {
                v2f o;
                o.pos = UnityObjectToClipPos (vertex);
                o.uvShadow = mul (unity_Projector, vertex);
                return o;
            }

            sampler2D _MainTex;
            fixed4 _Color;

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 tex = tex2Dproj (_MainTex, UNITY_PROJ_COORD(i.uvShadow));
                return _Color * tex.a;

            }
            ENDCG
        }
    }
}

这适用于大多数情况:

enter image description here

但是,每当它投射到透明表面(或多个表面)上时,它似乎为每个表面渲染了额外的时间。在这里,我用草纹和透明区域打破了草和铺路之间的鸿沟:

enter image description here

我尝试了很多混合和选项以及所有ZTesting选项。这是我能看到的最好的。

从阅读中我收集这可能是因为透明着色器不会写入深度缓冲区。我尝试添加ZWrite On,我尝试在主要传递之前进行传递:

Pass {
   ZWrite On
   ColorMask 0
}

但两者都没有任何影响。

如何修改此着色器,使其仅在最近的几何体上投影纹理?

期望的结果(photoshopped):

enter image description here

unity3d shader hlsl cg
1个回答
1
投票

问题是由于投影仪的工作原理。基本上,除了使用不同的着色器之外,它们第二次在其视野内渲染所有网格。在您的情况下,这意味着地面和与草一起的平面将呈现两次并且彼此叠加。我认为可以通过两个步骤解决这个问题;

首先,将以下内容添加到透明(草)着色器的标记中:

"IgnoreProjector"="True"

然后,将投影仪的渲染队列从“透明”更改为“透明+ 1”。这意味着地面将首先渲染,然后是草边,最后投影仪将投射到地面上(除了出现在顶部,因为它最后渲染)。

至于混合,我认为你想要常规的alpha混合:

Blend SrcAlpha OneMinusSrcAlpha

如果使用延迟渲染,另一个选项是使用deferred decals。这些都比投影仪更便宜,通常更容易使用。

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