我正在使用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
纹理中。
GL_RGB
纹理时,它可以正常工作。我在文档中没有找到任何关于如何使用帧缓冲对象来渲染深度通道与渲染RGB
通道有何不同的内容。 - axel22