使用帧缓冲区将深度缓冲区渲染为纹理

2024-04-17

我正在使用 JOGL,但这个问题通常适用于 OpenGL。似乎也有类似的问题,但它们要么是针对 GLSL 代码,与复制帧缓冲区的内容有关,要么是一般建议 - 使用帧缓冲区对象而不是glCopyTexSubImage2D.

Question

我正在做一些阴影贴图。如何使用帧缓冲区对象将深度通道直接渲染到纹理?

您能否发布一段初始化纹理和帧缓冲区对象的代码块,以及在渲染场景之前初始化所有内容的代码?

目前,我使用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)

这工作正常,纹理最终保留了场景的深度通道 - 这意味着我的投影和视图矩阵设置正确,可以从光的角度查看场景。我想改用帧缓冲区对象。

我需要在上面更改什么才能直接渲染到纹理而不是使用帧缓冲区对象?

EDIT:

这是我尝试过的。我首先初始化了帧缓冲区对象:

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_RGB and GL_COLOR_ATTACHMENT0,但它似乎不适用于GL_DEPTH_COMPONENT类型纹理和GL_DEPTH_ATTACHMENT- 深度通道不会渲染到纹理中textureNo above.


假设这是所有 FBO 设置代码,我看不到您调用的部分glCheckFramebufferStatus http://www.opengl.org/wiki/GLAPI/glCheckFramebufferStatus。你知道,这个函数会告诉你你的帧缓冲区对象不完整 http://www.opengl.org/wiki/FBO#Completeness_Rules,因此渲染它会失败。

具体来说,它会给你GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER​,因为您没有设置有效的绘制缓冲区。如果您不使用颜色附件,则需要使用glDrawBuffer http://www.opengl.org/wiki/GLAPI/glDrawBuffer设置所有颜色缓冲区写入GL_NONE.

这是一个常见的 FBO 陷阱;您不会是第一个没有见过它的人。但这就是为什么至关重要always check glCheckFramebufferStatus修改 FBO 后。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用帧缓冲区将深度缓冲区渲染为纹理 的相关文章

随机推荐