unity-Projector使用
前篇
可以利用 projector 组件, 将一个 纹理 投影到 指定层的 物体中, 且可以跟随物体的形状变化.
应用场景可以是
- 假阴影. 可以无视地形
- 能量圈
使用
可以参考工程中的 Projector.unity
一张黑色底的需要贴上去的, 并设置 wrap mode 为 clamp, 不然投影是会是 tiling 模式贴到物体中

添加一个空对象, 增加一个 projector 组件, 设置指定只投影到 Distort (自定义的层), 并创建一个材质球, 使用这个 shader

指定场景中需要接受投影的物体的层

效果

Drawcall 代价
投影到的物体有几个, 就会增加多少dc

shader
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| Shader "Its/Proj/Effect/Projector/MultiplyBlack" { Properties { _ShadowTex ("ShadowTex", 2D) = "gray" {} _FalloffTex ("FallOff", 2D) = "white" {} } Subshader { Tags {"Queue"="Transparent"} Pass { ZWrite Off Blend SrcAlpha one Offset -1, -1
CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct v2f { float4 uvShadow : TEXCOORD0; float4 uvFalloff : TEXCOORD1; 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); o.uvFalloff = mul (unity_ProjectorClip, vertex); return o; } sampler2D _ShadowTex; sampler2D _FalloffTex; fixed4 frag (v2f i) : SV_Target { fixed4 texS = tex2Dproj (_ShadowTex, UNITY_PROJ_COORD(i.uvShadow)); fixed4 texF = tex2Dproj (_FalloffTex, UNITY_PROJ_COORD(i.uvFalloff)); fixed4 res = lerp(fixed4(1,1,1,0), texS, texF.r); return res; } ENDCG } } }
|