【来点新鲜的】VR的渲染优化经验总结

2015年09月26日 11:13 0 点赞 0 评论 更新于 2025-11-21 19:05

文 / 逍遥剑客

在VR渲染中,需要为左右眼分别渲染两幅不同的画面。目前,大部分引擎采用直接渲染两遍的简单粗暴方式,然而,这种方式很难使性能达到75FPS(或90FPS)的要求。

以Oculus DK2为例,其原生分辨率为1920x1080,刷新率为75FPS。若开启超级采样(UE4默认135%),分辨率会提升至2592x1458,刷新率仍为75FPS。而Oculus的消费者版本和HTC Vive,分辨率和刷新率更是提升到了2160x1200@90FPS,推荐配置为GTX980。以135%的超级采样为标准计算,仅Color Buffer每秒的数据量就高达2160x1200x1.35x90x8 byte,约为2.34GB。这还未计算Post Processing中的多张Render Target以及Deferred Rendering的GBuffer、Light Buffer的数据量。

性能始终是VR渲染面临的最大挑战。秉持着能节省一点资源就节省一点的原则,以下是我总结的VR渲染优化方法:

减少重复渲染效果

尽管VR渲染需要生成左右两幅画面,但部分效果无需重复渲染两次,具体如下:

  • Shadow Map(阴影映射)
  • 部分Reflection(反射效果)
  • Occlusion Query(遮挡查询)
  • 大多数Post Processing(后期处理效果)

API层面的优化思路

多线程渲染的Command Buffer优化

若实现了多线程渲染,通常会有一个Command Buffer。可以直接分别以不同的View提交两次渲染任务。相较于针对每个物体分别提交两次的方式,这种方法能节省一些State切换开销。

Geometry Shader(几何着色器)的应用

使用Geometry Shader可直接将Mesh分成左右眼的部分,这样drawcall不会翻倍。不过,Geometry Shader的性能表现欠佳。

Instancing(实例化)技术

使用Instancing一次drawcall绘制两个Viewport,与Geometry Shader类似,但性能大约是其3倍。这些方法主要是减少API调用、State切换以及Vertex处理的消耗,那么如何减少瓶颈最大的Pixel处理消耗呢?

像素剔除与多分辨率着色

  • Stencil Mesh剔除像素:Valve采用一个Stencil Mesh,成功剔除了17%的像素。
  • Multi - Resolution Shading(多分辨率着色):NVIDIA的GameWorks提供了Multi - Resolution Shading方法。其原理是,边缘的像素经过变形后会有一定损失,并且人眼对视线中心的像素更为敏感,因此可以降低周围一圈像素的分辨率进行渲染。通过这种方式,能够节省25%到50%的像素处理量。

硬件层面的优化

双GPU渲染支持

NVIDIA和AMD都推出了双GPU渲染的支持,即每块GPU负责渲染一只眼睛的画面。这种方式在提升渲染性能的同时,也引发了一些调侃,有人认为这或许是显卡厂商促进显卡销售的策略。

插值生成中间帧

SONY的PS VR在PS4的机能下实现了120FPS的渲染效果。实际上,这是通过60FPS的画面通过reproject插值出中间帧实现的,其原理与Killzone的Temporal Reprojection和Oculus的Timewrap类似。

作者信息

洞悉

洞悉

共发布了 3994 篇文章