渲染到深度纹理 - 关于GL_OES_depth_texture使用的不清晰度

时间:2013-07-11 16:31:22

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

我正在尝试替换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,我会得到一个不完整的帧缓冲区。

1 个答案:

答案 0 :(得分:5)

深度纹理不会影响片段着色器的输出。当您渲染到深度纹理时,最终在深度纹理中的值将是固定功能深度值。

因此,如果没有gl_FragDepth,则无法真正“在片段着色器中设置深度”。但是,您可以执行您描述的操作,即在一次传递中为纹理渲染深度,然后在稍后的传递中读取该值的访问权。

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

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

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