unity-Projector使用

unity-Projector使用


前篇

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

应用场景可以是

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

使用

可以参考工程中的 Projector.unity

  1. 一张黑色底的需要贴上去的, 并设置 wrap modeclamp, 不然投影是会是 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
}
}
}