D5 全局光照方案详解
前言
要得到照片级的渲染图,广大用户的第一印象就是要使用离线渲染器。从定义上来说,“离线渲染”(或“预计算渲染”)对时间的要求没有那么严格,用户不需要瞬间看到渲染结果,而是会让渲染器根据设定好的模型,灯光,材质,充分计算数分钟甚至数小时。离线渲染器为了质量可以不计时间成本,所使用的渲染策略更侧重真实准确,因此能得到高质量的成果图。
那么照片级的图片可否实时渲染?这就完全是另外一个故事了,“实时渲染”对渲染时间提出了要求,它要每秒输出几十帧的画面才能保证流畅,每帧的渲染时间只有十几毫秒到几十毫秒的预算(每秒30帧的话,就是 33毫秒/帧)。在如此严苛的时间限制下,要得到逼真的渲染图,最大挑战就是:巨大的计算量。
我们来算一笔账:假设是 1920×1080 分辨率的画面,使用路径追踪的算法,每个路径计算3次反射,这就是 6,220,800 根光线,然而此时仅仅是每像素一个样本(1 spp:1 sample per pixel),画面看起来通常会是这样,充满噪点:
而要让画面“收敛”(“收敛”是术语,不学术的说法就是“渲染完成了,没什么噪点了”),则可能需要每个像素采上千个样本,画面会变成这样:
UE4 Path Tracer
渲染时间:3分45秒
样本数:2048样本/像素
显卡:英伟达 RTX 3060
此时如果观察画面局部,仍然会看到噪点:
以上这张图一共投射了 12,740,198,400 (120亿)根光线,渲染花费了超过3分钟,这样巨大的样本量,以目前的硬件速度,无论怎样优化,都无法让渲染时间缩短到“实时”的标准(数十毫秒/帧)。
RTX 技术能否带来改变?
RTX 技术已经极大地加快了显卡投射射线的速度,但以目前的数据来看,仍然不足以达到上文所述的采样数量要求。
我们来看英伟达官方的数据:英伟达 RTX 2080 Ti 显卡理论上可以每秒投射 10 Giga(100亿)的射线,但这个数据是在极其简单的场景下跑出来的:
放大看图中最下方的一排场景:单一模型,没有背景,只考察首次射线。
在实战中,用户的场景要远远复杂得多。而且除去求交点的射线,还要有大量的着色计算,这每秒100亿射线的测试数据在实际的渲染场景中要进一步打折扣。简单来说:RTX 并不能神奇地解决样本不足的问题。
降噪技术
在如此巨大的样本计算量面前,“傻算”是不可取的。事实上,没有人愿意“傻算”,所有渲染器(对,是所有)总会或多或少地使用一些小技巧(限制反弹次数,钳制高亮,自适应采样等),加快出图的速度,离线渲染器如此,实时渲染更是如此。现在的问题变成了:我们如何避免“傻算”,使用一些“作弊”或“小聪明”的技术,在实时情况下,渲染出看起来真实的画面。
这就要说到「降噪技术」了,近几年来不断进步的降噪技术至少让我们看到了实时照片级渲染的可能性。很多离线渲染器都在使用降噪技术加快出图速度,并且效果非常好,以往可能需要继续跑1个小时才能消除的噪点,使用降噪在几分钟内就能消除,呈现出完美平滑的最终图片。但这依然不能满足实时渲染的速度需求。
对于实时渲染来说,每一帧的降噪样本预算可能只有几样本/像素,留给降噪的时间预算可能只有1毫秒左右。这意味着降噪的效果不可能达到完美,但是要尽可能满足人眼的感知,看起来可信。
英伟达的实时降噪技术和 Open Image Denoiser 都可以在实时条件下达到不错的降噪效果,在只输入少量样本的情况下,瞬间得到平滑的图片:
Crytek Sponza 场景,使用 Intel® Open Image Denoiser 降噪, 16 spp, 输入有噪点的 albedo 和法线信息
图片来源:https://www.openimagedenoise.org/gallery.html
D5 GI 解析
简单总结一下,渲染要处理好两部分工作:采样和降噪,了解这个前提以后,D5 渲染研发团队努力的目标是比较明确的:
1.如何在图片降噪前,在短时间内得到更高质量的样本,特别是 Diffuse GI 样本。
2.如何在不同的应用场景(实时预览、静帧渲染、视频帧序列渲染)使用最合适的降噪技术。
GI 采样
相比于直接光照产生的阴影,间接光细节其实容易被观众所忽略,但是它对于场景画面是否真实可信起到了至关重要的作用。GI 差,则画面“假”,物体会有“漂浮感”,光感“不真实”。
高质量 GI vs 低质量 GI
在游戏等需要实时画面的应用中,传统的 GI 方案是使用纯光栅化,但渲染的效果不理想,对于静态的场景,通常要预先烘焙 lightmap。对于动态场景,则会使用到基于光照探针的 GI、VXGI、预计算 GI 等,上述的方法要么漏光,要么需要使用者对场景做一些人工处理(比如繁琐的展 UV、手动调整光照探针位置),或者预计算,总之需要制作者花费很多时间和精力,才能得到一个可用的实时场景。
而 D5 想要的是无论是动态场景还是静态场景,无需用户做过多处理,模型直接导入即可渲染。故此,我们尝试了有别于游戏实时渲染的做法,混合了多种渲染技术的优势,针对直接光照,多光源,大场景光照等不同的应用场景,分别做了优化,缓解性能压力,提升帧数,消除漏光和噪点。
混合的 GI 策略
为了高效取得样本,D5 GI 使用了混合的策略,结合使用了光线追踪和基于光照探针的 GI,在准确和效率之间寻找平衡点。
光照探针(Light Probe)是一种在实时渲染中使用得较多的 GI 采样方法,它运行效率高,而且能够处理动态场景的 GI。在读取场景的同时,无数的光照探针已经均匀地分布于整个场景的范围内,随着实时渲染的运行,每个光照探针都会动态更新其采集到的光照信息,并且会根据其重要性,改变更新频率,一些对场景影响不大的探针信息更新会变慢,以节约计算资源。
在纯光照探针 GI 方案中,当我们需要给模型上的某个点着色时,只需要找到邻近的几个光照探针,插值求得光照信息即可。由于是插值取样,这种 GI 计算结果往往体现为低频的亮度变化,平滑无噪点,在视觉上更容易被观众接受,相应地,会缺乏细节,而且会在模型边角产生“漏光”“漏阴影”,这是因为在插值取样时,读取到了过亮或过暗的探针信息:
如上图,墙角漏光是因为取值到了室外的探针,地板过暗是因为取值到了地下的探针。
为了增加 GI 的细节和准确性,D5渲染器在前几次 GI 反弹时使用了光线追踪采样,随后才会使用光照探针的信息,由于 Brute Force 反弹的准确性,D5 有效地改善了纯探针方案带来的漏光现象:
这种混合计算 GI 的策略既保证采样的速度,又保留了 GI 的细节,其效果是非常优秀的:
图为视频帧序列 GI 质量对比,左侧为路径追踪采样(通常作为标准参照),右侧为 D5 混合 GI 采样策略的计算结果。
左右采样时间相同,且左右均无降噪。
可见在相同采样时间下,D5 GI 迅速取得了较为真实可信的效果。
2.1 版增加反弹次数
在最新的 2.1 版中,D5 渲染器进一步增加了实时预览以及渲染输出中 Brute Force 光线反弹的次数,这会有效提高 GI 的准确性,对画面的真实感有更进一步的提升。
实时预览,只有直接光
实时预览,直接光+1次反弹(无降噪)
实时预览,直接光+2次反弹(无降噪)
植被 GI 优化
由于场景的光照探针数量是固定的,对于较大的场景,光照探针有可能过于稀疏,GI 的精度不足,这个问题在大场景的植被上会体现得比较明显,植物影子可能会偏亮,显出“漂浮感”。
针对这个问题,D5 专门对植物的 GI 采样做了调整,消除漂浮感,让影子更实,植物更加有落地感。
2.1 版 GI 采样算法优化
D5 研发团队认为先前版本实时渲染的体验依然不够好,在一些复杂场景中噪点依然多,导致降噪后在屏幕上留下了抖动的斑点。基于此,我们研发了更高效率的算法,进一步提升实时预览的性能。
先前版本 D5 在发射线时,受限于射线数量,首次反弹还是会有较大采样方差,在某些区域内可能只有少量采集到 GI,降噪后会看到斑块,以下是 GI 计算较为困难的场景,只打开了一扇门,室内完全由门口的反弹光照亮,先前D5实时 GI 结果如下:
新版 D5 GI 使用了 RestirGI 复用样本的思路,复用前帧和邻近位置的样本,尽量降低了一块区域内只有少量采到 GI 的问题,降低了采样噪斑,在平坦区域效果尤其明显。通过这样的优化,在 GI 采样的效率方面,较之于先前版本有大约近四倍的效率提升。这意味着实时预览效果更好,帧率更高,相同渲染时间下,图片 GI 质量更高。
D5 2.1 版 GI 算法改进后:
以上两图均为 1 spp(1样本每像素)
降噪
在不同的应用场景中,D5 渲染器使用了不同的降噪技术,以便在实时预览,静帧渲染和视频渲染三种不同的情况下,达到最好的效果。
实时预览
在高质量的实时预览中,D5 使用屏幕空间降噪(SSD),使用这种算法,每一帧 1920×1080 画面的降噪开销大约在 1-2ms 左右,保证了实时预览的帧率,让用户在创作场景的过程中能有所见即所得的交互体验,这是 D5 渲染器的核心价值所在。
实时预览屏幕空间降噪效果
静帧渲染
在输出静帧图片的时候,D5 采用的是 Open Image Denoiser,在进入降噪之前,每个像素已经有上百个天光采样和数十个 GI 采样,结合上文所述的 D5 GI 策略,得到了足够高质量的样本信息,将这些信息输入 AI 降噪器后,可以“瞬间”得到平滑的结果:
Open Image Denoise 降噪前 VS 降噪后
为了得到更好的降噪效果,Open Image Denoiser 还允许输入 Albedo 通道和法线通道,这样一来,就可以保证成果图边角和纹理的清晰。D5 使用了这个流程为静帧图片降噪。
Albedo
法线
上图:输入 Albedo 和法线信息后,AI 降噪结果细节更多,可见墙角的转折和木纹理更加清晰了。
视频帧序列渲染
Open Image Denoiser 缺乏前后帧的连贯性,这意味着在降噪视频后会造成视频画面的抖动和闪烁。
而屏幕空间降噪(SSD)可能会丢失一些画面的高频细节,为了缓解这个问题,我们使用了 World Space Denoiser(WSD),改变了降噪取样的方式:
左图红圈为屏幕空间降噪采样范围示意,
右图红圈为世界空间降噪采样范围示意。
根据场景的空间信息,决定降噪的强度,就可以保留更多的高频细节: