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

che*_*ica 2 opengl-es framebuffer depth-buffer opengl-es-2.0

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

我需要一种在片段着色器中设置深度的方法,因为在顶点着色器中设置它对于我的目的来说不够准确.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);
Run Code Online (Sandbox Code Playgroud)

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

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

小智 5

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

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

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

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

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