本文全手搓。只是全局光照的冰山一角,只是最粗略的介绍几个主要的思路与核心观念。若有纰漏与错误欢迎指正。
全局光照技术的引入让游戏画面更加逼真,通过模拟光在场景中传播时的物理行为,实现了更加准确的度量。而卡基亚的BRDF双向反射分布函数则成为了目前最为流行的材质模型,基于物理的模型让游戏画面更加真实。
1.传统渲染方程的创新
多光源处理在Deferred Rendering中,为了进一步优化性能,一般都会做多光源优化,比较常见的方式是Screen Space Tile Culling和Cluster Culling。
Screen Space Tile Culling 是基于屏幕空间对光源进行划分,把屏幕分成一定数量的Tile,每个Tile通过光源索引找出对这个Tile里面的Mesh有影响的光源,这个方法适合处理有着大量光源的场景,但对于某些特殊情况,如地铁隧道里面由于透视的关系大部分的光源都在一个Tile里面,这就会出现很远处的光源会对很近的物体造成影响的问题。
。而Cluster Culling的做法就是在Tile Base的基础上根据距离在横向再划分一次Tile,这个Tile的划分由距离决定,这样一块Tile表示的不再是一整个锥体,而是锥体里的一小块空间,用这种办法筛选的光源就准确很多了。
Card Page Tile Culling
Lumen对多光源的处理用的是Card Page Tile的方式,这种方式不再是在屏幕空间划分区域找区域内光源,而是找出光源会影响哪些区域。
Mesh Card生成好以后会储存在一张Card Page里面,Lumen在Card Page上进行Tile划分,可以理解为在Card Page上的每个Tile表示的是某个区域内的Mesh Card,只有在对应范围内的光源才会对这片区域的Mesh Card造成影响。
Lumen会在对应的Card Page Tile范围生成包围盒,通过包围盒判断光源是否能造成影响,如果有影响,将Light影响的所有Tile连续存储进RWLightTilesPerCardTile这个Buffer中。
一般来说每个Card Page Tile 含有8×8=64个Texels。
简单来说。lumen对传统渲染方程L(x,ωo)=Le(x,ωo)+∫Sfr(x,ωi→ωo)L(x′,ωi)G(x,x′)V(x,x′)dωi的解法进行改进,创造性引入距离场的概念,避免了传统计算光线与三角形求交导致的算法浪费与资源浪费。
但新的算法无法直接求得材质以及反射率。因此lumen创新性引入了表面缓存的概念。
2.表面缓存与辐射度算法
Lumen生成附近场景表面的自动参数化,这种方法称为 表面缓存(Surface Cache) 。使用这种方法可以快速查找场景中光线接触点的光照。Lumen会从多个角度捕获每个网格体的材质属性。这些捕获位置(即 卡(Cards) )是针对每个网格体脱机生成的。
lumen并不是ray tracing,而是ray casting,为弥补这一点,lumen使用radiosity(辐射度算法)来生成间接光。
综上lumen将直接光与间接光分类讨论,直接光使用距离场进行计算,而间接光使用radiosity(辐射度算法)
相关文献:https://zzk.cnblogs.com/s?w=radiosity
3.复用
利用递归思想,以相邻两帧为单位,在表面缓存中找出上一帧的间接光作为下一帧的直接光与真正的直接光计算下一帧的总光照。并且存入表面缓存中。
屏幕全局追踪:
Lumen首先在界面中使用追踪光线(即 屏幕追踪 或界面空间追踪),如未找到接触点或光线从表面后方穿过,然后再使用更可靠的方法。屏幕追踪支持所有几何体类型,可用于弥合Lumen场景和三角形场景之间存在的不一致情况。
使用屏幕追踪有一个弊端,那就是会严重限制美术设计,而美术设计仅适用于间接光照,例如间接光照缩放(Indirect Lighting Scale)或自发光增强(Emissive Boost)的光照属性。 在光源上设置较大的间接光照范围将会导致依赖于视图的全局光照,因为屏幕追踪无法正确支持它。
<iframe src=”” scrolling=”no” border=”0″ frameborder=”no” framespacing=”0″ allowfullscreen=”true”> </iframe>
相关文献最新为2023/4
https://www.cnblogs.com/tcohneyn/p/17705961.html
https://www.cnblogs.com/Gr-blogs/p/18119521#概述
lumen官方文档https://dev.epicgames.com/community/search?query=lumen&applications=unreal_engine