opengl es如何实现图片的帧交错显示,我想实现裸眼3D的功能
2个回答
展开全部
说说你的硬件是什么样的,是parallax barrier么,还是别的什么。裸眼3d的方法光有帧和帧之间的交错是不够的。3d的核心是让左眼和右眼看到的东西不一样,明白这点之后就可以结合硬件条件设计opengl的显示了。
更多追问追答
追问
嗯 对 原理我知道,我主要负责软件这边的设计,硬件那边具体采用什么不是很清楚,能不能先不看硬件,先考虑怎么实现帧交错显示的问题?我现在对这个如何显示一点头绪也没有,刚学OpenGL ES不久,很多东西不是很懂,能不能指导一下?
追答
不确定硬件的话我不敢说得太准。裸眼3d通常是把每一帧之内的每一列像素拆成屏幕上相邻的两列像素,奇数列显示的是左眼的图像,偶数列是右眼的。你可以把左右眼各自的图像分别渲染到两个纹理,然后最后在来一遍渲染,把这两个纹理交错组合起来。比如这两个纹理分别是texLeft和texRight的话,最后这遍渲染的fragment shader可以这样写:
vec2 pos; // 这个是从vertex shader传过来的当前像素的坐标(屏幕空间,单位是像素)
vec2 scr_size; // 屏幕的大小,单位是像素
vec2 texcoord = vec2(floor(pos.x / 2.0 + 0.5), pos.y) / scr_size;
vec4 pixelLeft = texture(texLeft, texcoord);
vec4 pixelRight = texture(texRight, texcoord);
gl_FragColor = mix(pixelLeft, pixelRight, (frac(pos.x / 2.0) - 0.5) * 2.0 + 0.5);
第三行用当前像素的坐标求出对应的texLeft和texRight中的纹理坐标。对于屏幕上的第2n-1列和第2n列像素,这个纹理坐标横坐标都是n,因为这两列应该分别显示左眼图像的第n列和右眼图像的第n列。然后两行分别读出左眼和右眼的像素。最后一行的作用是通过当前列是奇数列还是偶数列来决定显示左眼还是右眼的像素。虽然看起来是线性插值,但最后的系数只可能为0(完全显示左眼像素)或1(完全显示右眼像素)。等到你确定了硬件方面的细节之后可能需要做些具体的调整吧,但大概做法就是这样。
左右眼交错这一步也可以不单独作为一个渲染步骤,而是直接在渲染场景的时候就分别计算左右眼的像素,然后同样用最后一行选择一个像素输出。相当于把上面的那两个texture()调用换成实际的渲染代码。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询