文章目录
- 前言
- 一、在上一篇文章中,得到GI相关数据后,需要对其进行Lambert光照模型计算
- 二、在准备好上面步骤后,我们需要准备缺少的数据
- 1、准备上图中的 s.Normal
- 2、准备上图中的 s.Albedo
前言
Unity中Shader的GI的直接光实现,基于上一篇准备好的数据的基础上,继续实现GI的直接光效果
- Unity中Shader的烘培分支的判断
一、在上一篇文章中,得到GI相关数据后,需要对其进行Lambert光照模型计算
这是上一篇文章中得到 GI 数据的方法
LightingLambert_GI1(o,giInput,gi);
得到了之后,我们直接使用Unity自带的计算 Lambert 模型的函数计算即可,当然也可自己按照之前的文章实现 Lambert 光照模型
- Unity中Shader的Lambert光照的实现
这是在 Lighting.cginc 中Unity实现Lambert光照的方法
我们把它移植到我们自己的 cginc 中,方便管理修改(记着修改一下函数名,防止函数名冲突)
二、在准备好上面步骤后,我们需要准备缺少的数据
1、准备上图中的 s.Normal
这在之前的文章中,已经定义过很多次了,具体步骤如下
1.在appdata中,接受 half3 normal : NORMAL;
half3 normal : NORMAL;
2.在 v2f 中定义一个 half3 worldNormal :TEXCOORD;用于存放顶点法线数据
half3 worldNormal : TEXCOORD2;
3.在顶点着色器中,把 appdata 传入的数据转化到世界坐标下,存入 v2f 的worldNormal中
o.worldNormal = UnityObjectToWorldNormal(v.normal);
4.在片元着色器中,把 worldNormal 赋值给 SurfaceOutput 变量的 Normal
//1、准备 SurfaceOutput 的数据
SurfaceOutput o;
//目前先初始化为0,使用Unity自带的方法,把结构体中的内容初始化为0
UNITY_INITIALIZE_OUTPUT(SurfaceOutput,o)
o.Normal = i.worldNormal;
然后,我们在UnityLambertLight1中,返回一下diff,看看结果
在片元着色器,返回计算结果
fixed4 c = LightingLambert1(o,gi);
return c;
这是烘培前的效果:
这是烘培后的效果:(我们可以看见已经有基本的光照效果了)
2、准备上图中的 s.Albedo
在下一篇文章中准备