欢迎光临散文网 会员登陆 & 注册

URP | 物体多光源

2022-01-11 11:58 作者:那个人真狗  | 我要投稿

实现效果

效果

制作思路

默认管线

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

注意:平行光是没有光的是衰减,点光源需要考虑光的衰减


URP管线

多光源处理方式大改,不再像Built-in管线那样死板,全部由Unity的光照路径决定。

现如今是由URP管线的函数收集好场景中所有的光照信息,(多个灯的信息)

再传输给Pass,由我们开发者在Pass中决定采用那些光源进行光照计算 ,

计算完在叠加到光源结果上。


优点:

URP这样处理确实会降低drawcall来提升明显的性能 ,虽然会打破合批,但总体来说性能肯定更好

URP管线使用到函数

  1. 我们使用上面学习到的获取光照函数,GetMainLight()函数获取主光源

  2. 使用 GetAdditionalLightsCount() 函数 获取副光源个数

  3. GetAdditionalLight(index,WS_Pos)函数   获取其它的副光源世界位置

    iindex为灯光id编号,i.positionWS 顶点世界位置。

制作过程

标签管线

使用上面的漫反射Shader

  1. 修改渲染层级

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。

下一篇解决。


URP | 物体多光源的评论 (共 条)

分享到微博请遵守国家法律