《在移动VR中加速修正GPU桶形失真.docx》由会员分享,可在线阅读,更多相关《在移动VR中加速修正GPU桶形失真.docx(3页珍藏版)》请在第一文库网上搜索。
1、在移动VR中加速修正GPU桶形失真在上一篇文章中,我讨论了一个解决方案,即通过使用单个缓冲带渲染减少VR中的延迟。我提到,VR对图像质量的要求相当高,因为GPU相比传统的移动应用程序需要做更多的工作。工作负载增加的其中一个原因是对象内容需要进行两次渲染(每单位矩阵渲染一次)。另一个原因是GPU最后一次渲染使用了桶形失真过滤(每单位矩阵再渲染一次)。这使得图像处理器的工作负荷特别大,因此我们需要思考良策以降低负荷。为何使用透镜?您可能会有疑惑:当今的移动设备功能已十分强大,为什么我们还需要这些学校里习得的老旧的光学技巧?VR耳机使用透镜有两大主要原因:1 .透镜可以拓宽视野2 .透镜可以使屏幕与
2、你的眼睛离得更近例如,如果您的手机屏幕是I15cmX6.5cm,那么每只眼睛水平位置可视的屏幕宽度为5.75cm。由于屏幕与人脸非常靠近,因此相比人眼实际可视的宽度,这个宽度还远远不够。在两个屏幕之间放置一块透镜,那么不管是水平视角还是垂直视角,可视范围均会增加。使用透镜,我们可以使虚拟世界比实际世界看起来大很多。其次,有了透镜,即使用户的眼睛与屏幕非常接近,但其看到的屏幕效果比实际上的却远很多,这样使得用户体验更为轻松。显然,也存在一些缺陷。由于失真,图像的某些部分将被压缩,从而将失去一些信息;而剩下的部分则意味着要用更高的分辨率进行填充。同时,透镜导致的一些色差也需要被修正。桶形失真由于存
3、在桶形失真,我们需要应用反向转换,这样屏幕发出的光线才比较适宜。而这种转换的完成主要取决于物理透镜的设计。在VR中,透镜设计相当复杂。Ocu1usRiftCV1是一款做的非常好的VR案例。显然,所有这些设计的决策都会影响到修正图像所需的算法。桶形失真最常见的方法是使用。当然,还有很多其他可用的失真模型一一如使用多项式函数或曲线。一个常见的问题是创建的是非零逆函数(non-triva1)O为简单起见,我们将使用以下模型用于桶形失真,其逆函数可以进行计算:定义了我们想要应用的失真量,而由理论透镜设计进行界定。P中的输入值X和y在-1,+1之间是标准化的。p(x,0)的正向和反向失真函数,=0.3-
4、1.0-0.50.00.51.0Q呈增长态势的桶形失真图基于像素的修正VS基于网格的修正一个方法便是,在显示最后图像之前,在后期处理片段着色器中进行最后渲染的修正。假设将VR内容渲染至每矩阵的帧缓冲对象(FBO)中。使用OPenG1ES3.0,顶点着色器和片段着色器便如下所示:Aversion300esinhighpvec4posVtx;uniformmat4mvpM;voidmain(void)(g1_Position=mvpM*posVtx;Aversion300esinhighpvec2texFrg;outhighpvec4frgCo1;uniformhighpvec2centre;un
5、iformhighpsampIer2DtexSamp1er;voidmain(void)(highpvec4co1=vec4(0.0,0.0,0.0,1.0);*baseco1our*/highpf1oata1pha=0.2;*1ensparameter*/*1eft/Righteyeares1ight1yoffcentre*/*Norma1izeto-1,1andputthecentreto“centre*/highpvec2p1=vec2(2.0*texFrg-1.0)-centre;*Transform*/highpvec2p2=p1/(1.0-a1pha*1ength(p1);*Bac
6、kto0,1*/p2=(p2+centre+1.0)*0.5;if(a11(greaterThanEqua1(p2,vec2(0.0)&a11(IessThanEqua1(p2,vec2(1.0)(co1=texture(texSamp1er,p2);frgCo1=co1;)centre允许将失真集中的部分稍微移出FBO的中间位置,通常透镜并不完全集中到屏幕的左边或右边。这是我们可以使用的用来计算失真的最准确的方法。不过就GPU的使用而言,这种方法的成本也非常高。由于我们仅处理6个点(两个三角形到输出一个矩形),因此顶点着色器运行很快。另外,片段着色器需要在屏幕上为每个像素进行转换。所以对于1920X1080像素的显示,要进行2073600次运算及纹理查找。当然,我们可以做得更好!每个程序员都知道,良好性能的关键在于预计算和近似值。如果观察游戏的对象内容,可以看到这些对象中有很多近似值。像级联阴影贴图那样进行阴影计算。不过在未来有了光线追踪,这将得到极大的改金O