unity shader projector使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wodownload2/article/details/84983454

参考网址:
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;
	}		

猜你喜欢

转载自blog.csdn.net/wodownload2/article/details/84983454