我正在尝试替换gl_FragDepth
OpenGL ES 2.0 中缺少的 OpenGL 功能。
我需要一种在片段着色器中设置深度的方法,因为在顶点着色器中设置深度对于我的目的来说不够准确。AFAIK 做到这一点的唯一方法是拥有一个渲染到纹理的帧缓冲区,在该缓冲区上完成第一次渲染。此深度纹理存储屏幕上每个像素的深度值。然后,深度纹理附加在最终渲染通道中,因此最终渲染器知道每个像素的深度。
由于 iOS >= 4.1 支持GL_OES_depth_texture
,我正在尝试使用GL_DEPTH_COMPONENT24
或GL_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_OES
GL_DEPTH_COMPONENT24_OES
- 将纹理附加到 上是否正确
GL_DEPTH_ATTACHMENT
?如果我将其更改为GL_COLOR_ATTACHMENT0
,我将得到一个不完整的帧缓冲区。