unity-Projector使用

unity-Projector使用


前篇

可以利用 projector 组件, 将一个 纹理 投影到 指定层的 物体中, 且可以跟随物体的形状变化.

应用场景可以是

  1. 假阴影. 可以无视地形
  2. 能量圈

使用

可以参考工程中的 Projector.unity

  1. 一张黑色底的需要贴上去的, 并设置 wrap mode 为 clamp, 不然投影是会是 tiling 模式贴到物体中

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

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

  3. 效果


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; // 这两个矩阵是 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
}
}
}