Foveated Rendering作为VR中炙手可热的技术之一正在越来越多地被提及,尤其是手机上的VR,对于绘制分辨率和功耗都有着很高的要求。虽然不能说Foveated Rendering完美地解决了所有的问题,但是至少提供了一个比较好的折衷方案。
如上图显示,在眼睛可以观察到的中心区域,场景分辨率非常高,而在于一些外围区域,场景分辨率比较低。这个就是Foveated Rendering的主要精髓所在-在眼睛容易聚焦的区域显示高分辨率,在外围区域显示低分辨率,相对于全屏的高分辨率显示就可以有效地减少GPU的计算,从而降低功耗。
如何设置好聚焦区域和外围区域以及对于外围区域采用哪一层的低分辨率 (详见OpenGLES关于mipmap level的介绍) 是Foveated Rendering的一个挑战。最终的解决方案将是一个折衷,不仅仅关系到人眼的最佳可视化和降低GPU功耗,而且还关系到如何最大程度地挖掘出GPU的功能,让GPU和这个特性更好地连接在一起。
VR的原理是通过修改两只眼睛看到的两幅2D场景的角度来模拟立体3D场景的效果,所以通过VR设备看到的任何场景都是左右眼两幅2D场景的融合。
对于Foveated Rendering,假设现在只应用到两种分辨率这种简单的情况,那么就一共需要四幅2D场景,其中两幅场景用来模拟高分辨率的聚焦区域,另外两幅场景用来模拟低分辨率的外围区域。考虑到GPU需要一次性输出3D场景,Oculus公司提出的multiview扩展将可以很好地解决这个问题。
Multiview这个扩展的提出就是为了解决同时输出多个场景时,减少
为Foveated Rendering设置4个view将可以最大程度地利用GPU的性能。关于multiview的用法,在malideveloper上已经有一篇非常好的文章了-Mali OpenGL ES SDK for Android: Using multiview rendering 。
究竟Foveated Rendering可以为GPU减少多大的损耗呢,我们可以来粗略地计算一下。假设输出的场景最大分辨率是1080p (1920x1080),聚焦区域场景的分辨率约为720p (1280x720)。
最后,如何将Foveated Rendering和GPU更好的结合在一起是一个比较深入的话题,和各家GPU厂商的架构有直接的联系,我们拭目以待这项技术的成熟并且可以直接被GPU为利用。