简要归纳UE5 Lumen全局光照原理

一、Jim kajiya老爷子的渲染方程:

请添加图片描述
求全局光照就是求解渲染方程,我们将两边都有未知数的渲染方程变换成离散形式:
请添加图片描述
更形象的描述这个离散的渲染方程:
请添加图片描述
要给每个三角形着色就得先判断光线有没有和它相交,以下是求光线和三角形相交的次数的计算,5次反弹已经是天文数字,无限次反弹目前的GPU根本做不到实时:
请添加图片描述

二、工程上的实时全局光照技术:

在这里插入图片描述
他们实现各异,但本质都是逼近渲染方程:L=E+KE+K²E 但实际上的实现间接光都只有一次反弹
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
Lumen创新性的采用直接光和间接光分开求取:用距离场求得直接光,表面缓存求间接光。
在这里插入图片描述

三、Lumen的解决办法:

1.用距离场 Distance Field(SDF)判断光线和三角面相交:

在这里插入图片描述
距离场Distance Field用一个个点阵确定离它最近三角面的距离。

怎么用距离场判断光线是否和三角面相交呢?
在这里插入图片描述
离光源最近的点是3,往前步进3一定不会和任何三角面相交。
在这里插入图片描述
在这里插入图片描述
再从3判断离自己最近的三角面是1,继续往前步进1,也不会有任何三角面相交。
在这里插入图片描述
一直步进到新的点离三角形的距离小于0.01,那么说明光线和这个三角面相交了。
在这里插入图片描述
如果这个距离阈值越来越大,那么就可以判断这条光线没有和任何三角形相交,可以不用计算着色了。

距离场是提前算好的离线数据,所以三角面求交变得很快,当然如果物体移动了也要重新计算距离场:
在这里插入图片描述
但即使重新计算距离场也比传统的和所有三角面判断求交更快。

2.表面缓存(Surface Cache)

距离场(SDF)有个致命的问题就是只能判断相交,无法获取材质信息,所以无法给三角面着色。那么UE5就引入了表面缓存(Surface Cache):
在这里插入图片描述
不包含材质信息,无法计算BRDF(求光线怎么反弹)。

这里我们需要引入一个概念辐射度算法:
在这里插入图片描述
将场景离散成面元组成,那么一个面元向外辐射的能量等于其他面元辐射给它的能量之和。
在这里插入图片描述

在这里插入图片描述
面元细分的越多,间接光的反弹次数就越多,成像也就越逼真。

接下来就是怎么计算B1面元的对外辐射呢?B2 B3 B4都是未知数,那就得用Lumen中最重要的实时光照基础:复用reuse

复用reuse:即用上一帧接收的光照做为本帧的向外辐射的能量(光照)。这样就可以求得B1
在这里插入图片描述
所谓的表面缓存(Surface Cache)就是两帧画面的光照中转站:
在这里插入图片描述
在这里插入图片描述
Lumen巧妙的利用了第0帧面元的直接光是已知的特性,对面元单独求解,规避了传统辐射度算法需要联立方程组求解未知数的难度:
在这里插入图片描述
这样就可以近似实现无限次反弹的计算。

四、Lumen工程上的具体实现,会根据物体的距离采用不同的加速方案:

在这里插入图片描述
Lumen的厉害之处在于,它融合了经典的全局光照思路(光线追踪+辐射度算法),以及一系列巧妙的工程手段,解开了原本无法直接求解的渲染方程。

posted @   Cxihu田树东  阅读(438)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示