参考网址:
http://blog.sina.com.cn/s/blog_471132920101hhsd.html
https://blog.csdn.net/winchyy/article/details/51564489
https://www.jianshu.com/p/1fade1e8c309
https://docs.unity3d.com/Manual/class-Projector.html
http://qiankanglai.me/2016/11/14/unity-projector/index.html //分析与shadowmap优劣比较
http://www.dreamfairy.cn/blog/2018/11/19/unity-projector-opmize/
新建一个空的项目,导入unity自身的资源包:
全部导入,可以看到:
这里有三个projector的prefab。
首先学习第一个:BlobLightProjector
新建一个场景:
这里我们只创建了一个plane,然后把BlobLightProjector拖出放到Plane的下面。
然后就看到了有一盏聚光灯。
下面来分析其shader实现:
右键边界此shader,可以看到源码:
1、shader属性声明:
Shader "Projector/Light" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1) //主颜色
_ShadowTex ("Cookie", 2D) = "" {} //阴影纹理
_FalloffTex ("FallOff", 2D) = "" {} //渐变纹理
}
2、子shader的Tags以及一些运算符号
Subshader {
Tags {"Queue"="Transparent"} //声明渲染队列为3000,透明队列,较为靠后渲染
Pass { //第一个通道
ZWrite Off //关闭深度写入
ColorMask RGB //参考https://docs.unity3d.com/Manual/SL-Pass.html,这里只有RGB写入缓冲
Blend DstColor One //混合模式为目标颜色和1进行混合
Offset -1, -1 //顶点x偏移-1,y偏移-1,
关于什么是源颜色和目标颜色,以及混合模式,参考网址:
https://blog.csdn.net/aurora_mylove/article/details/1700540
http://blog.sina.com.cn/s/blog_471132920101d8z5.html //风雨冲
这里总结下:
混合公式:
Blend SrcFactor DstFactor //SrcFactor是源系数,DstFactor是目标系数
3、包含头文件以及声明顶点片段函数名称:
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "UnityCG.cginc"
4、顶点着色器的输出
struct v2f {
float4 uvShadow : TEXCOORD0; //第一个纹理坐标
float4 uvFalloff : TEXCOORD1; //第二个纹理坐标
UNITY_FOG_COORDS(2) //雾的知识后面再讲
float4 pos : SV_POSITION; //顶点的齐次坐标
};
5、两个矩阵
float4x4 unity_Projector;
float4x4 unity_ProjectorClip;
6、顶点着色器的函数
v2f vert (float4 vertex : POSITION)
{
v2f o;
o.pos = UnityObjectToClipPos (vertex); //局部坐标变换为齐次坐标
o.uvShadow = mul (unity_Projector, vertex); //???
o.uvFalloff = mul (unity_ProjectorClip, vertex); //???
UNITY_TRANSFER_FOG(o,o.pos);
return o;
}