处理VR透镜畸变的三种方法

处理VR透镜畸变的三种方法

该文章英文地址,翻译中有一些个人添加的辅助信息,以括号标识,”注:”开头,以粗体表示,例如(注:以下为个人翻译,水平有限,欢迎指正).
沉浸感需要大的视场角.这可以通过将一个大的弯曲的球形显示器放到你的面前的方式来实现,但是这样的方案是非常昂贵的.一个更加实惠的解决方案是通过在一个小的矩形的显示屏上增加一个透镜,然后通过透镜来看这个显示屏,从而获得更大的视场角:
这里写图片描述
透镜靠近你的眼睛能够极大的增加你的视场角,但是这是有代价的:图像会显得扭曲畸变.越大的视场角,就会有越大的图像畸变.这篇文章是对三种不同的图像反畸变处理的介绍,这些方法都已经在WebVR相关的项目中实现了.
这里是一个典型的头带显示器的镜头畸变例子.透过镜头图像产生了”枕型”畸变:
这里写图片描述
解决方法是对这些畸变的图像使用”桶型”畸变.当我们通过畸变透镜上看,这些图像(注:是指经过”桶型”反畸变处理的图像)看起来就是正常的:
这里写图片描述
透镜的畸变从数学公式上来看是容易裂解的,方程如此所示(注:从代码上看OSVR openVR上所使用的反畸变算法都是采用这个的),,特定的透镜对应相应的畸变系数.为了更好的消除畸变,我们还需要计算两只眼睛中心之间的距离,为此需要知道一些关于显示器几何结构以及它们的外壳结构.这些都可以做到,及时是在web上!我总结了以下几个可选的实现方案.
1.方案基于片段(bad)
最简单的方法是通过二次渲染.首先,我们渲染左眼和右眼图像到纹理上,然后用片段(像素)着色器处理这个纹理,将每一个像素向内移动到眼睛的中心上.
这里写图片描述
这是最初的、最简单的方法,也是效率最低的方法,因为每个像素都要被分别处理.WebVR的第一个版本是由Boilerplate实现的.
2.方案基于网格(better)
第二种方案与之前相比,不是采用单独处理每一个像素的方法,我们队相对稀疏的网格的顶点做畸变处理(40x20效果不错).
这里写图片描述
这种方案可以减少很多直接计算的资源,让GPU做大量的插值运算.不采用对每一个像素(1920*1080约为2e6)做处理,我们队网格中的每个顶点做计算(40*20 = 800).结果是极大的减少了计算量(减少了3个数量级),在性能上有不错的提升.WebVR Polyfill现在实现了这个方法.
在这个畸变方法中渲染不是唯一的占用大量资源的部分.一些时间被浪费在用来拷贝整个场景的中间纹理.
3.方案基于顶点位移(best)
这个方案是三种方案中最有效的,首先它不需要渲染中间纹理.在这种方法中,几何结构通过自定义的定点着色器已经产生了畸变.这个方法已知摄像头的位置,我们用已经”桶型”畸变的2D渲染结果代替顶点.在这种方案中,不需要二次渲染,我们可以节省拷贝渲染到纹理的步骤.
这种方法需要在每个已经畸变的网格上有一定的顶点密度.想象一个简单的例子,四个顶点的矩形非常靠近摄像头的渲染情况,畸变这些顶点滞后,仍然是一个4个顶点的扁平的矩形,不会有”桶型”的效果.因此,这些方法的使用通常还需要一些额外的开发工作.
这里写图片描述
这种方法已经被用于开源的VR View项目的Cardboard Design Lab.基于几何畸变的方法还可能导致图像看起来比较锋利,因为之前的2种方法会导致混叠,尤其是中间纹理很小的时候.你可以阅读更多关于畸变的方法.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值