【问题标题】:Prevent transparent areas being shaded by projection shader防止透明区域被投影着色器着色
【发布时间】:2019-04-09 22:09:32
【问题描述】:

我正在尝试制作贴花着色器以与 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
        }
    }
}

这在大多数情况下都很有效:

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

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

通过阅读,我认为这可能是因为透明着色器没有写入深度缓冲区。我尝试添加ZWrite On,并尝试在主通道之前进行通道:

Pass {
   ZWrite On
   ColorMask 0
}

但两者都没有任何效果。

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

想要的结果(照片):

【问题讨论】:

    标签: unity3d shader hlsl cg


    【解决方案1】:

    问题在于投影仪的工作方式。基本上,除了使用不同的着色器外,它们会第二次渲染其视野内的所有网格。在您的情况下,这意味着地面和带有草的平面都将被渲染两次并相互叠加。我认为可以使用两个步骤来解决此问题;

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

    "IgnoreProjector"="True"
    

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

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

    Blend SrcAlpha OneMinusSrcAlpha
    

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

    【讨论】:

    • 完美运行,谢谢。不过,我也会再次查看延迟贴花,我只是在 Unity 首次发布它时快速浏览了一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多