VR之头盔镜片畸变补偿

来源:互联网 发布:windows优化大师8.0 编辑:程序博客网 时间:2024/05/17 06:17

VR之头盔镜片畸变补偿

利用全景视频以及相关的硬件设备(头盔、眼镜)构建VR场景非常火爆,各个视频网站、科技公司纷纷上线相应的全景视频源或者推出自己的VR设备。包括google的cardboard,腾讯的炫境,暴风魔盒等等。[google cardboard VR](http://tech.huanqiu.com/news/2015-05/6544546.html)这些设备构造上大同小异,而且由于凸透镜片自身原因,或大或小的都会使原本正常的图片发生畸变。畸变由视界中心向视界边缘逐渐变大。最为直观感觉是,在视界中心的直线移动到视界边缘时会发生弯曲。[关于镜片畸变](https://en.wikipedia.org/wiki/Distortion_%28optics%29)最为典型的镜片畸变包括“桶形畸变”和“枕型畸变”。分别由正常图像向“径向”压缩/拉伸而形成。关于桶形畸变的原理以及数学模型可以参考:(http://stackoverflow.com/questions/6199636/formulas-for-barrel-pincushion-distortion)经测试,现有的几个VR头盔or盒子都会使得图像发生枕型畸变,区别仅仅是畸变的程度不同而已。为了使图像正常显示,需要预先对图像进行桶形畸变的补偿。![畸变后的图像](http://img.blog.csdn.net/20160104152831518)以下在fragment shader中实现这样的畸变:
// GLSL 代码precision mediump float;varying vec2 vTextureCoord;uniform sampler2D sTexture;// 桶形畸变vec2 brownConradyDistortion(vec2 uv){    // 左右视窗缩小倍数设置    float demoScale = 1.0;    uv *= demoScale;    // positive values of K1 give barrel distortion, negative give pincushion(图像畸变程度设置)    float barrelDistortion1 = 0.08; // K1 in text books    float barrelDistortion2 = 0.0; // K2 in text books    float r2 = uv.x*uv.x + uv.y*uv.y;    uv *= 1.0 + barrelDistortion1 * r2 + barrelDistortion2 * r2 * r2;    return uv;}void main() {       // uv -> device-coordinate    // 坐标范围(-1,+1)    vec2 uv = vTextureCoord;    uv = uv * 2.0 - 1.0;    // barrel distortion    uv = brownConradyDistortion(uv);    //  device-coordinate -> uv    uv = 0.5 * (uv * 1.0 + 1.0);    //     vec4 color;    if(uv.x>1.0||uv.y>0.93||uv.x<0.0||uv.y<0.07){            color = vec4(0.0,0.0,0.0,1.0); // 超出显示范围,设颜色为黑。    }else{        color = texture2D(sTexture, uv);    }    gl_FragColor = color;}
1 0
原创粉丝点击