我已经使用Unity投影仪和自定义着色器来创建来自投影仪的自定义图像形状的效果。效果很好,除非投影机的光线与项目的另一个副本的光线接触,则将灯光的颜色组合在一起。我不希望这种情况发生,因此,例如,如果我为两台投影机都指定了绿色,并且光相互接触,则两台投影机的光应该重叠并保持绿色。这是我的意思的图片:
我是着色器的新手,并在网上找到了该着色器。非常感谢您提供有关如何修改着色器以实现目标的帮助。否则,如果有另一种方法可以实现此目标,那就太好了。我尝试将每台投影机放到一个层中,并告诉它们在投射光时忽略该层,但这没有效果。谢谢。
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
}
}
}
答案 0 :(得分:0)
Blend SrcAlpha OneMinusSrcAlpha
与评论所说的不同,Blend One One
是常规的加性(线性减淡)混合模式。使用这种新的混合模式,您需要确保纹理也具有Alpha通道。
答案 1 :(得分:0)
在这种情况下,Blend One OneMinusSrcAlpha
可能会更好地工作,因为这样也可以避免留有边界切口。