2

我正在尝试替换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);

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

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

1 回答 1

5

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

所以没有 gl_FragDepth,你就不能真正“在片段着色器中设置深度”。但是,您可以执行您所描述的操作,即在一个通道中将深度渲染到纹理,然后在以后的通道中读取访问该值。

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

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

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

于 2013-07-21T21:57:58.307 回答