使用帧缓冲器呈现深度缓冲器到纹理(Render the depth buffer into a te

2019-09-22 19:34发布

我使用JOGL,但这个问题也适用于OpenGL的一般。 似乎有躺在附近类似的问题,但它们在GLSL代码,通过直接,有复制帧缓冲区的内容做的,或者是一般的建议-使用帧缓冲区对象,而不是glCopyTexSubImage2D

我做了一些阴影映射。 如何直接呈现的深度信道使用一个帧缓冲器的对象的纹理?

能否请您发表初始化纹理和帧缓冲区对象,以及该渲染场景之前,一切都初始化代码的代码块?

目前,我使用glCopyTexSubImage2D 。 我初始化质地是这样的:

glGenTextures(1, &textureNo)
glBindTexture(GL_TEXTURE_2D, textureNo)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL)
glTexParameterf(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY)
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 2048, 2048, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, null)

然后我渲染这样的:

glBindTexture(GL_TEXTURE_2D, textureNo)
glClear(GL_DEPTH_BUFFER_BIT)
drawScene()
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 2048, 2048)

和这个工作正常,纹理最终保持场景的深度信道 - 这意味着我的投影和视图矩阵设定正确地从视光点观看场景。 我想使用帧缓冲区对象,而不是。

我需要做什么来改变上面直接渲染到纹理,而不是使用帧缓冲区对象?

编辑:

以下是我试过了。 我首先初始化帧缓冲器的对象:

glGenFramebuffers(1, &fbo)

然后我呈现:

glBindFramebuffer(GL_FRAMEBUFFER, fbo)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, textureNo, 0)
glBindTexture(GL_TEXTURE_2D, textureNo)
drawScene()

我已确认上述作品类型的纹理GL_RGBGL_COLOR_ATTACHMENT0它似乎,但不为其工作GL_DEPTH_COMPONENT型纹理和GL_DEPTH_ATTACHMENT -深度频道没有渲染到纹理textureNo以上。

Answer 1:

假设这是所有的FBO设置代码,我没有看到你所说的部分glCheckFramebufferStatus 。 你知道,这会告诉你,你的函数帧缓冲区对象是不完整的 ,因而渲染它会失败。

具体来说,它会给你GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER​ ,因为你没有设置有效的绘图缓冲器。 如果你不使用附色,你需要使用glDrawBuffer设置所有颜色缓冲区写入GL_NONE

这是一个常见的疑难杂症FBO; 你不会是第一个没见过它。 但是,这就是为什么它是至关重要的, 经常检查glCheckFramebufferStatus您修改后的FBO。



文章来源: Render the depth buffer into a texture using a frame buffer