我正在使用 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_RGB
和的纹理GL_COLOR_ATTACHMENT0
,但它似乎不适用于GL_DEPTH_COMPONENT
类型纹理和GL_DEPTH_ATTACHMENT
- 深度通道不会渲染到上面的纹理textureNo
中。