将纹理数据写入深度缓冲区

我试图实现在深度合成图像描述的技术。

这个想法是使用现有的纹理(从图像加载)作为深度面具,基本上假3D。

我面临的问题是,OpenglES中没有glDrawPixels。 有没有办法在iPhone上完成同样的事情?

深度缓冲区比您在OpenGL ES中更加模糊; 不仅glDrawPixels不存在,而且gl_FragDepth已从GLSL中删除。 所以你不能写一个自定义片段着色器来将值caching到深度缓冲区,因为你可能会推送颜色。

最明显的解决scheme是将深度信息打包到纹理中,并使用自定义片段着色器对片段生成的片段和从提供的纹理中查找片段进行深度比较。 只有当生成的片段更接近时才允许继续。 正常的深度缓冲区会捕捉其他遮挡情况,原则上可以使用帧缓冲区对象来创build深度纹理,从而为您提供完整的GPU上的往返行程,尽pipe它与您的问题。

缺点是绘图会花费你额外的纹理单位,纹理使用整数部分。

编辑:为了保持简单的例子,假设你将所有的深度信息都包含在纹理的红色通道中。 这会给你一个非常低的精度深度缓冲区,但只是为了保持清楚,你可以写一个快速片段着色器,如:

void main() { // write a value to the depth map gl_FragColor = vec4(gl_FragCoord.w, 0.0, 0.0, 1.0); } 

将深度存储在红色通道中。 因此,您已经部分重新创build了旧的深度纹理扩展 – 您将获得更接近的像素中更亮的红色图像,更远的更深的红色像素。 我认为在你的问题,你实际上从磁盘加载这个图像。

为了在未来的片段着色器中使用这个纹理,你可以这样做:

 uniform sampler2D depthMap; void main() { // read a value from the depth map lowp vec3 colourFromDepthMap = texture2D(depthMap, gl_FragCoord.xy); // discard the current fragment if it is less close than the stored value if(colourFromDepthMap.r > gl_FragCoord.w) discard; ... set gl_FragColor appropriately otherwise ... } 

编辑2:你可以在这里看到一个从深度到RGBA值的更好的映射。 直接绑定到该文档,OES_depth_texture绝对不支持iPad或第三代iPhone。 我还没有在别处运行完整的testing。

Interesting Posts