Unity3D自定义着色器可防止添加灯光?

时间:2018-07-20 11:39:34

标签: unity3d shader

我已经使用Unity投影仪和自定义着色器来创建来自投影仪的自定义图像形状的效果。效果很好,除非投影机的光线与项目的另一个副本的光线接触,则将灯光的颜色组合在一起。我不希望这种情况发生,因此,例如,如果我为两台投影机都指定了绿色,并且光相互接触,则两台投影机的光应该重叠并保持绿色。这是我的意思的图片:

enter image description here

我是着色器的新手,并在网上找到了该着色器。非常感谢您提供有关如何修改着色器以实现目标的帮助。否则,如果有另一种方法可以实现此目标,那就太好了。我尝试将每台投影机放到一个层中,并告诉它们在投射光时忽略该层,但这没有效果。谢谢。

Shader "Custom/MyProjectorShader" {
Properties{
    _Color("Tint Color", Color) = (1,1,1,1)
    _Attenuation("Falloff", Range(0.0, 1.0)) = 1.0
    _ShadowTex("Cookie", 2D) = "gray" {}
}
Subshader{
    Tags{ "Queue" = "Transparent" }
    Pass{
        ZWrite Off
        ColorMask RGB
        Blend SrcAlpha One // Additive blending
        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 _ShadowTex;
        fixed4 _Color;
        float _Attenuation;

        fixed4 frag(v2f i) : SV_Target
        {
            // Apply alpha mask
            fixed4 texCookie = tex2Dproj(_ShadowTex, UNITY_PROJ_COORD(i.uvShadow));
            fixed4 outColor = _Color * texCookie.a;
            // Attenuation
            float depth = i.uvShadow.z; // [-1 (near), 1 (far)]
            return outColor * clamp(1.0 - abs(depth) + _Attenuation, 0.0, 1.0);
        }
        ENDCG
    }
}
}

2 个答案:

答案 0 :(得分:0)

Blend SrcAlpha OneMinusSrcAlpha

与评论所说的不同,Blend One One是常规的加性(线性减淡)混合模式。使用这种新的混合模式,您需要确保纹理也具有Alpha通道。

https://docs.unity3d.com/Manual/SL-Blend.html

答案 1 :(得分:0)

在这种情况下,Blend One OneMinusSrcAlpha可能会更好地工作,因为这样也可以避免留有边界切口。