鉴于上面描述的CPU的六面体变换算法的问题。我们首先想到的是用多媒体指令集来对facebook的算法进行加速。但这面临一个问题是,算法里面有大量的查表操作,不适合用单指令多数据(SIMD)的指令来优化。即使对少部分代码进行了优化,也解决不了在上篇中遇到的困境。
因此,需要换个思路。在头脑中首先想到的是用GPU的“画图”功能来做这种转换。主要感觉是GPU画图的速度非常快,稍微好点的GPU就能实时画4K的视频图像,其价格应该比服务器级别的CPU便宜简单多了,硬件实现嘛,速度肯定比软件的速度快。这里采用了OpenGL语言,既然是画图。
有了使用GPU的想法之后,直观的想法是,先把二维的世界地图画到地球仪上,然后在地球仪内放一个正六面体。眼睛放在球心位置,设置FOV为90度,然后变换眼睛的朝向,分别对准正六面体的六个面的中心位置,将球面投影到各个面上,获得的六幅图像,将这些图像存成依次排列的六个面(排列方法根据自己需要来制定)。于是CubeMap的全景图像就得到了。
这个想法有个问题,就是把二维的等圆柱图像渲染成一个球面的速度问题。当绘制的球越光滑越逼近的时候,绘制所需要的时间就越长,基本已经不能实时。这点背离了我们的初衷。且如果绘制的球面不够光滑,则投影到六面体上的图像也会不够准确,导致数据的丢失或失真。
所以从这个角度而言,这种方法对于单幅的图像而言,可行;对于大量的连续视频而言,速度和精度都不好。走到这里,我们发现遇到了困难,及时止损,再想想其他的辙。