使用立方体贴图时的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',GLint layer = 1)"   0.02    -

... 我什么都没清除,然后重新开始以新的矩阵方向绘制,直到渲染了6个面。

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

glCreateTextures(
    GL_TEXTURE_CUBE_MAP,1,&m_identifier
);

glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);

glTextureStorage2D(
    m_identifier,GL_DEPTH_COMPONENT32F,256,256
);

解决方法

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

请注意,我说的是“图像”,而不是纹理”。纹理包含图像,但就帧缓冲区而言,相同纹理中的不同图像没有相互之间的关系。帧缓冲操作仅会影响当时附加到其上的图像。

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

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...