URP | Lambert/Half-Lanbert光照模型
光照函数库
本次我们需要使用光照的,故需要引用光照函数库
//光照函数库
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
这个库在那找到打开,下图

光照的结构体

光照函数 GetMainLight() 获取灯光。

这里有三个函数
注意 HLSL有一个新的变量类型real,定义在commom.hlsl库里,
这个变量是会根据不同的平台编译float或half。
法线数据
模型空间变化到世界空间的法线变换函数
HLSL 获取法线变换函数 TransformWorldToObjectNormal

这个函数在 spaceTransforms.hlsl 这个库里。
Lambert | 兰伯特
增加光照函数库

模型结构体里获取顶点法线信息
输出结构体
顶点着色器阶段,调用模型空间转换到世界空间函数
注意:第二个变量是让我们确定是否使用标准向量,一般设置 true
片元着色器阶段获取光照信息
第一段代码,定义一个变量 获取场景光源信息 GetMainLight();
上面也看到函数,有方向,光照距离衰减,阴影衰减,颜色等信息。
Light mylight = GetMainLight();

第二段代码,获取光照颜色,real4 变量就是上面说的 -
这个变量是会根据不同的平台编译float或half。
real4 LightColor = real4(mylight.color,1);
第三段代码,类似获取光照方向,前面部分是归一化一下。
float3 LightDir = normalize(mylight.direction);
第四段代码 计算 LdotN
float LdotN = dot(LightDir,i.normalWS);
效果

Lambert 兰伯特光照模型,就是使用 光的方向,和法线方向计算。

漫反射光照符合兰伯特定律(Lambert's law): 反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比。因此,漫反射部分的计算如下:
Cdiffuse=(Clight · mdiffuse)max(0, n · I ) 其中, n 是表面法线, I 是指向光源的单位矢量, mdiffuse 是材质的漫反射颜色, clight 是光源颜色。需要注意的是,我们需要防止法线和光源方向点乘的结果为负值,为此,我们使用取最大值的函数来将其截取到 0, 这可以防止物体被从后面来的光源照亮。
Half-Lanbert | 半兰伯特
半兰伯特和兰伯特相比,只是将法线向量与光照方向向量的点乘结果用一种更好的方式区间转化到了(0,1)区间:

效果对比

总结
学习HLSL光照函数的使用,有哪些新的方法。

顶点法线信息,模型转换到世界空间新的函数。默认设置 true
实现基础兰伯特光照模型。