admin管理员组

文章数量:1567522


2024年6月7日发(作者:)

在移动VR中加速修正GPU桶形失真在上一篇文章中,我讨论了一个解决方案,

即通过使用单个缓冲带渲染减少VR中的延迟。我提到,VR对图像质量的要求相

当高,因为GPU相比传统的移动应用程序需要做更多的工作。

工作负载增加的其中一个原因是对象内容需要进行两次渲染(每单位矩阵渲染一

次)。另一个原因是GPU最后一次渲染使用了桶形失真过滤(每单位矩阵再渲染

一次)。这使得图像处理器的工作负荷特别大,因此我们需要思考良策以降低负

荷。

为何使用透镜?

您可能会有疑惑:当今的移动设备功能已十分强大,为什么我们还需要这些学校

里习得的老旧的光学技巧?

VR耳机使用透镜有两大主要原因:

1 .透镜可以拓宽视野

2 .透镜可以使屏幕与你的眼睛离得更近

例如,如果您的手机屏幕是I15cmX6.5cm,那么每只眼睛水平位置可视的屏幕宽

度为5.75cm。由于屏幕与人脸非常靠近,因此相比人眼实际可视的宽度,这个宽

度还远远不够。在两个屏幕之间放置一块透镜,那么不管是水平视角还是垂直视

角,可视范围均会增加。

使用透镜,我们可以使虚拟世界比实际世界看起来大很多。

其次,有了透镜,即使用户的眼睛与屏幕非常接近,但其看到的屏幕效果比实际

上的却远很多,这样使得用户体验更为轻松。

显然,也存在一些缺陷。由于失真,图像的某些部分将被压缩,从而将失去一些

信息;而剩下的部分则意味着要用更高的分辨率进行填充。同时,透镜导致的一

些色差也需要被修正。

桶形失真

由于存在桶形失真,我们需要应用反向转换,这样屏幕发出的光线才比较适宜。

而这种转换的完成主要取决于物理透镜的设计。

在VR中,透镜设计相当复杂。Ocu1usRiftCV1是一款做的非常好的VR案例。显

然,所有这些设计的决策都会影响到修正图像所需的算法。

桶形失真最常见的方法是使用。当然,还有很多其他可用的失真模型一一如使用

多项式函数或曲线。一个常见的问题是创建的是非零逆函数(non-triva1)O为

简单起见,我们将使用以下模型用于桶形失真,其逆函数可以进行计算:

α定义了我们想要应用的失真量,而α由理论透镜设计进行界定。P中的输入

值X和y在[-1,+1]之间是标准化的。

p(x,0)的正向和反向失真函数,α=0.3

-1.0 -0.5 0.0 0.5 1.0

Q呈增长态势的桶形失真图

基于像素的修正VS基于网格的修正

一个方法便是,在显示最后图像之前,在后期处理片段着色器中进行最后渲染

的修正。假设将VR内容渲染至每矩阵的帧缓冲对象(FBO)中。使用OPenG1

ES3.0,顶点着色器和片段着色器便如下所示:

Aversion300es

inhighpvec4posVtx;

uniformmat4mvpM;

voidmain(void)

(

g1_Position=mvpM*posVtx;

}

Aversion300es

inhighpvec2texFrg;

outhighpvec4frgCo1;

uniformhighpvec2centre;

uniformhighpsampIer2DtexSamp1er;

voidmain(void)

(

highpvec4co1=vec4(0.0,0.0,0.0,1.0);∕*baseco1our*/

highpf1oata1pha=0.2;∕*1ensparameter*/

∕*1eft/Righteyeares1ight1yoffcentre*/

∕*Norma1izeto[-1,1]andputthecentreto“centre"*/

highpvec2p1=vec2(2.0*texFrg-1.0)-centre;

∕*Transform*/

highpvec2p2=p1/(1.0-a1pha*1ength(p1));

∕*Backto[0,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


本文标签: 失真屏幕透镜需要进行