【问题标题】:Rendering to depth texture - unclarities about usage of GL_OES_depth_texture渲染到深度纹理 - 关于使用 GL_OES_depth_texture 的不确定性
【发布时间】:2013-07-11 16:31:21
【问题描述】:

我正在尝试替换 OpenGL ES 2.0 中缺少的 OpenGL gl_FragDepth 功能。

我需要一种在片段着色器中设置深度的方法,因为在顶点着色器中设置深度对于我的目的来说不够准确。 AFAIK 做到这一点的唯一方法是使用渲染到纹理的帧缓冲区,在该缓冲区上完成第一次渲染。此深度纹理存储屏幕上每个像素的深度值。然后,在最终渲染过程中附加深度纹理,因此最终渲染器知道每个像素的深度。

由于 iOS >= 4.1 支持GL_OES_depth_texture,我尝试使用GL_DEPTH_COMPONENT24GL_DEPTH_COMPONENT16 作为深度纹理。我正在使用以下调用来创建纹理:

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, textureId, 0);

帧缓冲区创建成功,但我不知道如何进行。我对附加到帧缓冲区的深度纹理缺乏一些基本的了解。

  • 我应该在片段着色器中输出什么值?我的意思是,gl_FragColor 仍然是一个 RGBA 值,即使纹理是深度纹理。我无法在片段着色器中设置深度,因为 OpenGL ES 2.0 中缺少 gl_FragDepth
  • 如何在最终渲染过程中读取深度纹理,其中深度纹理附加为sampler2D
  • 如果我将glTexImage2D 的第三个参数设置为GL_DEPTH_COMPONENT16GL_DEPTH_COMPONENT16_OESGL_DEPTH_COMPONENT24_OES,为什么会得到一个不完整的帧缓冲区
  • 将纹理附加到GL_DEPTH_ATTACHMENT 是否正确?如果我将其更改为GL_COLOR_ATTACHMENT0,我会得到一个不完整的帧缓冲区。

【问题讨论】:

    标签: opengl-es opengl-es-2.0 framebuffer depth-buffer


    【解决方案1】:

    深度纹理不会影响片段着色器的输出。渲染到深度纹理时最终出现的值将是固定函数深度值。

    因此,如果没有 gl_FragDepth,您将无法真正“在片段着色器中设置深度”。但是,您可以按照您的描述进行操作,即在一个通道中将深度渲染到纹理,然后在以后的通道中读取访问该值。

    您可以使用 texture2D 内置函数读取深度纹理,就像读取常规颜色纹理一样。您返回的值将是 (d, d, d, 1.0)。

    根据深度纹理扩展specification,不支持将 GL_DEPTH_COMPONENT16_OES 和 GL_DEPTH_COMPONENT24_OES 作为深度纹理的内部格式。我希望这会产生错误。你得到的不完整的framebuffer状态很可能和这个有关。

    将纹理附加到 GL_DEPTH_ATTACHMENT 是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多