效果如下
GameObject上挂Projector脚本。
一张类圆环状图片,
重要的是材质的shader
Shader "Projector/Custom" { Properties{ _ShadowTex("Cookie", 2D) = "gray" {} _FalloffTex("FallOff", 2D) = "white" {} } Subshader{ Tags{ "Queue" = "Transparent" } Pass{ ZWrite Off ColorMask RGB //Blend DstColor Zero Blend SrcAlpha OneMinusSrcAlpha Offset -1, -1 CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_fog #include "UnityCG.cginc" struct v2f { float4 uvShadow : TEXCOORD0; float4 uvFalloff : TEXCOORD1; UNITY_FOG_COORDS(2) float4 pos : SV_POSITION; }; float4x4 _Projector; float4x4 _ProjectorClip; v2f vert(float4 vertex : POSITION) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, vertex); o.uvShadow = mul(_Projector, vertex); o.uvFalloff = mul(_ProjectorClip, vertex); UNITY_TRANSFER_FOG(o,o.pos); return o; } sampler2D _ShadowTex; sampler2D _FalloffTex; fixed4 frag(v2f i) : SV_Target { fixed4 texS = tex2Dproj(_ShadowTex, UNITY_PROJ_COORD(i.uvShadow)); //texS.a = 1.0-texS.a; //fixed4 texF = tex2Dproj(_FalloffTex, UNITY_PROJ_COORD(i.uvFalloff)); //lerp(fixed4(1, 1, 1, 0), texS, texF.a); fixed4 res = texS; UNITY_APPLY_FOG_COLOR(i.fogCoord, res, fixed4(1,1,1,1)); return res; } ENDCG } } }
把材质球拖到projector上,有些东西不想被投射到的可以修改Ignore