利用顶点位移进行VR畸变校正
VR开发的最大挑战之一是对高帧率与高分辨率结合的要求。我们通过把顶点转化为“镜头空间”,删除了需要全屏渲染的纹理,这样就可以大规模提高手机性能。
下面的技术使用谷歌的Cardboard Unity SDK进行开发,应用于Cardboard Design Lab(CDL),然而,利用透镜畸变效果,给与适当的失真系数去构成顶点着色器,并且SDK允许禁止渲染纹理,这样同样的方法可以适用于任何VR系统。
Google公司的Cardboard Design Lab,在Google Play这个场景中可能使用了唯美的处理,但实际上是非常细化。
一些背景
在审查这个技术之前,重要的是要了解大多数的VR渲染是如何处理的。对于为什么我们需要镜头畸变,以及典型实施的来历,可以查看Oculus rift documentation这一部分。
镜头畸变
VR应用的镜头畸变阻碍了头戴式显示器(HMDs)的玻璃透镜的物理畸变,从而得到一个无明显失真图像的宽视野。
在大多数VR软件中,反畸变是通过将每个照相机渲染成一个单独的渲染目标来执行,然后将后处理效果的图像进行扭曲。无论是在一个像素着色器,或者通过将渲染目标投影到一个扭曲的网格上,都将最终输出渲染到屏幕上。
本文演示了一种技术,在场景中的每个对象都在顶点着色之前执行渲染,从而消除对单独渲染目标的需求。渲染目标的消除同时几乎消除掉移动设备上的热问题,并允许在全分辨率上MSAA增加2至4倍也不会对散热或目标帧率有显着影响。
值得注意的是,我不是第一个想到这一点的人,但据我所知,Cardboard Design Lab是第一个使用这种技术开发VR应用的。此外在项目开始的时候,谷歌的团队已经做了顶点变形版本的雏形,最终成为代码是包含在今天的SDK。
所以充分证明,我会因为坚持顶点变形为基础的镜头校正能够在生产应用中工作而受到大家的好评,它对于在谷歌已经写CGine文件的一些性能算法工程师是一种喜讯。我写这篇文件是因为(A)它确实能使用,(B)希望更多的开发者使用它使VR应用变得更好;(C)引擎开发者实现正向渲染仍然很棒,MSAA仍然很可怕,依靠全屏后处理对核心功能有不良影响。
问题
在开发一个移动VR应用中,有3个主要的考虑因素影响工程成果,这些因素或多或少约束着什么是可能的。
- 帧率
- 可视化分辨率
- 散热
帧率
帧率是我们比较熟悉的。在整场游戏中30-60帧是普遍可以接受的。在VR中,60帧是一个最低限度,而且大家有共识是一个好的VR体验帧率要在90-120帧之间。
当然,在移动设备上,我们可以做得最好。许多设备设置最大帧率是60帧,所以我使用60作为本文的其余部分的参照。
当一个VR体验低于60帧,效果是立竿见影的。头部跟踪不出现'保持'的显示时,用户会迷失方向,并且体验更可能出现模拟器问题。瞬