繁体   English   中英

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

[英]Render the depth buffer into a texture using a frame buffer

我正在使用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

假设这是所有FBO设置代码,那么我看不到调用glCheckFramebufferStatus的部分。 您知道,该函数会告诉您您的Framebuffer对象不完整 ,因此渲染该对象将失败。

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

这是常见的FBO陷阱。 您将不会第一个没有看到它。 但这就是为什么在修改FBO之后始终检查glCheckFramebufferStatus至关重要的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM