URP | 物体多光源
实现效果
效果


制作思路
默认管线
使用多光源计算,需要俩个Pass渲染光照效果,第一个Pass计算平行光,第二个Pass计算点光源,然后第二个Pass叠加到前面。

注意:平行光是没有光的是衰减,点光源需要考虑光的衰减
URP管线
多光源处理方式大改,不再像Built-in管线那样死板,全部由Unity的光照路径决定。
现如今是由URP管线的函数收集好场景中所有的光照信息,(多个灯的信息)
再传输给Pass,由我们开发者在Pass中决定采用那些光源进行光照计算 ,
计算完在叠加到光源结果上。
优点:
URP这样处理确实会降低drawcall来提升明显的性能 ,虽然会打破合批,但总体来说性能肯定更好
URP管线使用到函数
我们使用上面学习到的获取光照函数,GetMainLight()函数获取主光源
使用 GetAdditionalLightsCount() 函数 获取副光源个数
GetAdditionalLight(index,WS_Pos)函数 获取其它的副光源世界位置
iindex为灯光id编号,i.positionWS 顶点世界位置。
制作过程
标签管线
使用上面的漫反射Shader
修改渲染层级

2. 增加变量属性

公用变量
注意: 第一个知识点 HLSLINCLUDE 的使用
3. 使用 HLSLINCLUDE 语法 把公共字段放进去,包括 CBuffer

详细 语法 查看
URP | 基础CG和HLSL区别
结构体
4. 顶点着色器阶段,输入信息顶点结构体,输出片元结构体

扩展 Core函数
VertexPositionInputs VertexNormalInputs 核心的函数
在 Core 函数库里 有俩个结构体,是官方给我们创建的好的,

看一下结构体里有那些内容

第一个函数 获取顶点位置信息,输出世界空间位置,视图空间等等。

第二个函数 获取顶点法线信息,输出 世界空间下法线信息,

这里有俩个函数
输入 法线信息,和 切线信息
输出 世界空间下法线信息, 世界空间下切线信息,世界空间下副切线信息。
下图是详细介绍,是那些空间关系

资料参考
https://blog.csdn.net/kan464872327/article/details/109605639
顶点阶段
注意 : 第二个 关键知识点 VertexPositionInputs VertexNormalInputs
5. 在顶点阶段计算出片元结构体的信息,使用上面介绍的函数
计算完成
片元着色器阶段
在片元着色器阶段是正式开始计算。
前把顶点着色器阶段的数据传入。
采样贴图
下面计算 主光漫反射 效果
漫反射 = 主光的颜色,颜色贴图,漫反射颜色,以及 NdaotL。
在计算高光部分
输出颜色
效果

多光源计算
场景多增加几个点光源,

现在还是没有效果,
现在需要我们的开关,增加开关 变量

使用判断的语句,如果开启就执行多光源计算
前获取 有多少个副光源,颜色就叠加几次使用for循环
这部分获取其他副光源的世界空间的位置信息。
计算漫反射和高光
这一部分和上面的一样。
注意 : light.distanceAttenuation * light.shadowAttenuation 这一部分是计算点光源的距离衰减和阴影衰减
在计算高光。
计算完的颜色与原来的颜色叠加就可以了,
看一下切换多光源的效果

原代码
现在这个计算有俩部分代码是重复的。优化可以把重复的使用函数调用。
总结
HLSLINCLUDE 的使用 这一部分是一开始知道,没有深入理解,

HLSLINCLUDE的使用,可以把公共变量放进去,或者公共结构体等,如果多个pass这个方法很好用。
Core函数 的使用,里面给我们封装好了函数,直接调用就可以。

详细参考
https://blog.csdn.net/kan464872327/article/details/109605639
多光源效果计算,主要是获取其他光源的位置信息,每个灯光在计算一次。
主要有俩个函数
GetAdditionalLight()
GetAdditionalLightsCount()

问题: 场景中增加多个点光源的时候出现错误,

注意事项
URP管线中,点光源不支持实时阴影,如果想实现点光源阴影采用光照烘焙
注意 :点光源和聚光灯都不支持间接反射阴影。

想要副光源也能够产生阴影,需要先在URP管线的Inspector面板下为Additional Lights勾选上Cast Shadows。
下一篇解决。