【发布时间】:2020-12-08 04:49:32
【问题描述】:
我使用 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
}
}
}
【问题讨论】: