首页 > 解决方案 > 使用立方体贴图时 OpenGL 清除缓冲区

问题描述

我正在使用 nvidia nsight 图形来检查使用立方体贴图清除帧缓冲区时会发生什么。

我无法弄清楚清除是否会影响所有六个面,或者我是否必须在清除之前指定要渲染的面。

实际上,我需要知道如何正确清除立方体贴图。每个面或按帧缓冲区。

编辑:

这是通话记录:

Issues (324)    Event   Description CPU ms  GPU ms
563 "void glBindFramebuffer(GLenum target = GL_FRAMEBUFFER, GLuint framebuffer = '4')"  0.02    -

Issues (324)    Event   Description CPU ms  GPU ms
565 "void glViewport(GLint x = 0, GLint y = 0, GLsizei width = 256, GLsizei height = 256)"  <0.01   -

Issues (324)    Event   Description CPU ms  GPU ms
566 "void glClearNamedFramebufferfv(GLuint framebuffer = '4', GLenum buffer = GL_DEPTH, GLint drawbuffer = 0, GLfloat* value = {1})"    0.03    <0.01

Issues (324)    Event   Description CPU ms  GPU ms
567 "void glNamedFramebufferTextureLayer(GLuint framebuffer = '4', GLenum attachment = GL_DEPTH_ATTACHMENT, GLuint texture = '59', GLint level = 0, GLint layer = 0)"   0.01    -

Issues (324)    Event   Description CPU ms  GPU ms
570 void glUseProgram(GLuint program = '616')   <0.01   -

一些绘图(我没有报告程序和绘图日志),我看到原语在 nvidia 软件中命中帧缓冲区,没有任何警告,所以我认为帧缓冲区是有效的。

下一张脸:

Issues (324)    Event   Description CPU ms  GPU ms
914 "void glNamedFramebufferTextureLayer(GLuint framebuffer = '4', GLenum attachment = GL_DEPTH_ATTACHMENT, GLuint texture = '59', GLint level = 0, GLint layer = 1)"   0.02    -

...我什么都没有清除,然后我再次开始使用新的矩阵方向进行绘制,直到渲染了 6 个面。

EDIT2,这是我创建阴影立方体贴图的方法:

glCreateTextures(
    GL_TEXTURE_CUBE_MAP,
    1, 
    &m_identifier
);

glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);

glTextureStorage2D(
    m_identifier,
    1,
    GL_DEPTH_COMPONENT32F,
    256,
    256
);

标签: openglframebuffer

解决方案


帧缓冲区附有图像。帧缓冲区操作会影响当前附加到它们的图像。

请注意,我说的是“图像”而不是纹理“。纹理包含图像,但就帧缓冲区而言,同一纹理中的不同图像彼此没有关系。帧缓冲区操作仅影响附加到它的图像时间时间。

如果将特定立方体贴图面附加到帧缓冲区,则该面就是附加到 FBO 中该附加位置的图像。对帧缓冲区的操作会影响该图像,但帧缓冲区既不知道也不关心纹理中可能存在的任何其他立方体贴图面。帧缓冲区仅处理当前附加的图像。

此外,如果要清除要用于渲染的帧缓冲区附加图像,则在发出 clear 调用时,必须将要清除的图像附加到 FBO。如果您打算清除要附加的图像,则清除然后附加是没有意义的。

如果要将整个纹理清除为特定值(例如立方体贴图的所有面),可以使用glClearTexImage.


推荐阅读