为VR优化UE4渲染器
序言
为了开发《Farlands》,Oculus团队为UE(Unreal Engine,虚幻引擎)编写了一个实验性的、快速的正向渲染器。该渲染器也被应用于《Dreamdeck》和《Showdown》的Oculus商城版本中。我们分享了渲染器的源代码样本,旨在帮助开发者在其应用中实现更高的质量水平和帧率。作为Unreal开发者,你可以从https://github.com/Oculus-VR/UnrealEngine/tree/4.11-ofr获取这个渲染器。
以固定90Hz的频率渲染大量VR图像是一项复杂且具有技术挑战性的任务。在创建VR内容时,很多情况下它与传统的“仅用于监视器”的内容有所不同。VR不仅为我们带来了丰富多样的全新交互体验,同时也促使开发者重新审视旧有的假设,并提出新的思路。近期的VR浪潮为开发者带来了机遇,也展现了他们的创新能力。
在工作过程中,我们重新评估了一些关于VR渲染的传统假设,并开发了新技术,以帮助我们在90Hz的频率下提供高保真的内容。现在,我们将分享其中的一些成果:针对UE 4.11的实验性正向渲染器。
我们开发了具有特殊限制条件的Oculus Unreal渲染器,它使我们能够更轻松地创建高保真、高性能的体验,并且我们希望将其分享给所有的UE4开发者。
背景
当团队开始《Farlands》的产品开发时,我们回顾了在Oculus Connect、GDC、CES等活动中的demo体验。我们仅使用UE4来创建这些内容,UE4为我们提供了无与伦比的编辑环境和丰富的先进渲染特性。
然而,将渲染结果输出到Rift(Oculus的一款VR头显)实际上意味着我们只能使用这些特性的一部分。我们希望研究那些我们最常用的特性,并探索是否可以设计一个精简的渲染器。这个渲染器能够提供更高的性能和更好的视觉保真度,同时允许团队继续使用UE4的顶级编辑器和引擎。
Oculus Unreal渲染器专注于Oculus应用的用例,它已经被改造为无需对已有项目(包括《Showdown》和《Oculus Dreamdeck》)的主要内容进行开发。在这些情况下,它提供了更清晰的视觉体验,并且释放了足够的GPU资源,以便启用额外的特性或将分辨率提高15 - 30%。
高分辨率下的比较
Unreal默认的延迟渲染器在高分辨率下运行帧率小于60fps,而Oculus Unreal渲染器能够以90fps的帧率运行。
延迟VR的问题
UE以其先进的渲染特性集和保真度而闻名,那么我们为VR改变其渲染方式的原因是什么呢?主要源于我们创建VR内容的经验,以及渲染到监视器和渲染到Rift之间的差异。
在为Rift创建小样时,我们发现大多数着色器都非常简单,并且主要依赖于详细的纹理,这些纹理只需要少量的查找和简单的算法。当使用延迟着色器时,这意味着我们的GBuffer通路受到纹理的极大限制——我们从大量的纹理数据中读取,向GBuffers写入数据,但在这两者之间几乎不进行其他操作。
我们也很少使用动态照明和阴影,并且在很大程度上依赖于预计算照明。实际上,切换渲染器帮助我们一次提供一组更有限的特性,提高了GPU的利用率,启用了优化,减少了带宽开销,并且使我们更容易达到90Hz的帧率。
我们还比较了MSAA(多重采样抗锯齿)和Unreal的TAA(时间抗锯齿)。TAA在仅用于监视器的渲染中性能表现良好,并且与延迟渲染结合得也很好,但在VR中会产生明显的伪影现象。特别是在人头部运动期间,它会导致图像颤抖和几何走样。需要注意的是,我们自己的着色器和顶点动画方案会使这种情况更加严重,但大部分原因还是归因于VR头盔的工作方式。
与监视器相比,每个Rift像素覆盖了观众视野的很大一部分。一个典型的监视器在每立体角上的像素数量比VR头盔多10倍。为Oculus SDK提供的图像需要通过一个额外的重采样层来补偿头盔的光学效果,这种额外的过滤往往会使图像过于平滑。
所有这些因素共同促使我们希望在渲染时尽可能保留更多的图像细节。我们发现MSAA能够产生比我们预期更清晰、更详细的图像。
延迟与正向放大比较
在VR中,延迟渲染和正向渲染在放大效果上存在明显差异。
正向:一个更好的选择
目前最先进的渲染技术通常会利用屏幕效果,如SSAO(屏幕空间环境光遮蔽)和SSR(屏幕空间反射)。这些效果虽然能够产生真实且高保真的视觉影响,但在VR中的效果并不理想。单纯在屏幕上进行操作可能会导致不正确的立体差异(即我们看到的图像差异),这会让很多人感到不适。考虑到渲染这些效果的代价,我们在实际应用中放弃对这些特性的支持会更加合适。
综合考虑所有因素后,我们决定实现一个正向渲染器。关键在于,正向渲染允许我们使用MSAA抗锯齿,向富纹理着色器中添加算法(同时减少GBuffer写入),移除可能干扰异步时间扭曲的昂贵全屏通道,并且总体上使更具特性的延迟渲染器适度提速。切换到正向渲染器还支持单视场背景渲染,这可以显著提升大型、复杂几何场景的渲染性能。然而,这些优点并不适用于所有人。我们的目标是与虚拟现实技术开发者分享我们的经验,帮助他们继续努力,使顶级内容能够以90Hz的帧率运行。
我们的实现基于Ola Olsson在2012年的HPG论文《集群延迟和正向着色》。熟悉传统正向渲染的读者可能会关心使用这种渲染器时CPU和GPU在动态灯光方面的开销。幸运的是,现代的正向照明方法不需要额外的绘制调用:所有的几何和灯光都在一个单一通道中渲染(还有一个可选的z-prepass)。通过使用计算着色器预计算哪些灯光会影响场景的3D“群集”(每只眼睛视体的细分,形成一个截头锥体元素网格),上述操作成为可能。利用这些数据,每个像素可以轻松定义具有高空间相干性的灯光列表,并且可以实现一个利用当代GPU高效分支能力的照明循环。这提供了精确的选择,并且能够有效地处理少量动态光,同时避免了额外绘制调用和渲染通道的开销。
三维光网格可视化
三维光网格可视化展示了照明相干性和选择的原理。
除了渲染器本身,我们还对UE4进行了修改,以允许额外的GPU和CPU优化。该渲染器作为未维护的样本和非正式支持的SDK提供,但我们很高兴为使用UE顶级引擎和编辑器的项目提供另一种呈现虚拟现实世界的选择。
作为Unreal开发者,目前你可以从Github资源库获取它。如果你想亲身体验,可以试试《Farlands》《Dreamdeck》和《Showdown》。