繁体   English   中英

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

[英]Writing texture data onto depth buffer

我正在尝试实现下面描述的技术: 用深度合成图像

我们的想法是使用现有纹理(从图像加载)作为深度蒙版,基本上伪造3D。

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

深度缓冲区比您在OpenGL ES中想象的更加模糊; 不仅glDrawPixels缺席,而且gl_FragDepth已从GLSL中删除。 因此,您无法编写自定义片段着色器以将值假脱机到深度缓冲区,因为您可能会推送颜色。

最明显的解决方案是将深度信息打包到纹理中,并使用自定义片段着色器,在它生成的片段和从您提供的纹理中查找的片段之间进行深度比较。 只有当生成的片段更近时才允许继续。 普通深度缓冲区将捕获其他遮挡情况 - 原则上 - 您可以使用帧缓冲对象来创建深度纹理,为您提供完整的GPU上往返,尽管它与您的直接相关问题。

缺点是绘图将花费您额外的纹理单位和纹理使用整数组件。

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

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

在红色通道中存储深度。 因此,您已经部分地重新创建了旧的深度纹理扩展 - 您将拥有一个更亮的红色像素更近的图像,更暗的红色像素更远。 我认为在您的问题中,您实际上是从磁盘加载此图像。

然后在未来的片段着色器中使用纹理,您可以执行以下操作:

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 ...
}

EDIT2:你可以看到从深部更聪明映射到一个RGBA值这里 要直接绑定到该文档,iPad上或第三代iPhone上肯定不支持OES_depth_texture。 我没有在其他地方进行过完整的测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM