转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2909

上一篇讲了低端硬件上如何运行deferred框架。本文是这系列的最后一篇,将会介绍KlayGE 4.5中对虚拟现实设备Oculus Rift的支持。

Oculus Rift是Oculus VR公司推出的虚拟现实头盔。它几乎是市面上同等设备中价格最便宜同时效果最好的一款VR头盔。在硬件上,它分为输入和输出两个系统。输入系统是个9轴sensor(陀螺仪、罗盘、加速度计),采样率高达1000Hz。能精确提供头盔的朝向。第二代设备甚至能提供局部移动信息。输出系统是一个7寸的屏幕,因为和眼睛的距离很近,可以覆盖整个视域。

OVR

Oculus同时还提供了个Oculus SDK,可以通过它得到sensor的输入,和输出的参数。但渲染之后的后处理等,需要程序自己处理。

输入系统

KlayGE中新增加了sensor输入的支持,能把平板、手机的sensor输入反馈到程序和摄像机控制器。凃鸣把这个系统扩展到了rift上,把从rift拿到的数据转成KlayGE的输入引擎需要的结构。如此一来,就能复用原有的代码,把rift接入整套体系。

需要注意的是,rift可以提供当前的旋转quaternion或预测一定时间之后的quaternion。使用预测的效果会比当前的好,因为渲染发生的时刻晚于获取sensor数据的时刻。

输出系统

Oculus的输出是立体显示的,所以需要左右眼两幅图像。SDK只支持渲染两次场景,并把图像做一些矫正后输出到rift。这么做的话性能至少减半了。从KlayGE 4.1开始,立体显示就已经改成只从中间渲染一次,用它输出的color和depth做image warping得到左右两眼的图像。虽然从中间看不到的像素也不会出现在左右眼图像中,但绝大部分像素看不出问题。因此能在基本不降低性能的情况下做立体显示。对于增加rift的支持,也不打算破坏这个规则。

原先做立体显示的时候,两眼距离等参数是可以在后期调整的。而近距离头盔对于眼睛位置fov长宽比等都要和设备严格一致,否则两眼对焦对不上。所以都得从SDK获取这些参数,传给渲染引擎使用。最终做到了在1个pass内,用warping的方法把一幅图像处理成适用于rift的图像,性能下降可以忽略不计。

Oculus VR

有了这么一套输入+输出的支持,终于可以漫游在3D场景里了。

未来

理论上通过扩展输入设备,可以把同样的框架推广到所有的VR设备。在输入与输出的延时方面,卡马克大神在Oculus SDK 0.3.x里加了个time warping方法,可以补偿渲染的过程中头部运动造成的角度差,减少眩晕的感觉。这个方法对普通渲染甚至都有好处,在以后的KlayGE中我会进行尝试。