使用立方体贴图时 OpenGL 清除缓冲区
OpenGL clear buffer when using a cubemap
我正在使用 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
);
帧缓冲区附有图像。帧缓冲区操作会影响当前附加到它们的图像。
注意我说的是“图像”而不是纹理”。纹理包含图像,但就帧缓冲区而言,同一纹理中的不同图像彼此没有关系。帧缓冲区操作仅影响当时附加到它的图像。
如果将特定的立方体贴图面附加到帧缓冲区,则该面就是附加到 FBO 中该附加位置的图像。帧缓冲区上的操作会影响该图像,但帧缓冲区既不知道也不关心纹理中可能存在的任何其他立方体贴图面。帧缓冲区仅处理当前附加的图像。
此外,如果你想清除你将要用来渲染的帧缓冲区附加图像,你想清除的图像必须在你发出清除调用时附加到 FBO。如果您打算清除要附加的图像,先清除再附加是没有意义的。
如果要将整个纹理清除为特定值(例如立方体贴图的所有面),可以do that with glClearTexImage
。
我正在使用 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
);
帧缓冲区附有图像。帧缓冲区操作会影响当前附加到它们的图像。
注意我说的是“图像”而不是纹理”。纹理包含图像,但就帧缓冲区而言,同一纹理中的不同图像彼此没有关系。帧缓冲区操作仅影响当时附加到它的图像。
如果将特定的立方体贴图面附加到帧缓冲区,则该面就是附加到 FBO 中该附加位置的图像。帧缓冲区上的操作会影响该图像,但帧缓冲区既不知道也不关心纹理中可能存在的任何其他立方体贴图面。帧缓冲区仅处理当前附加的图像。
此外,如果你想清除你将要用来渲染的帧缓冲区附加图像,你想清除的图像必须在你发出清除调用时附加到 FBO。如果您打算清除要附加的图像,先清除再附加是没有意义的。
如果要将整个纹理清除为特定值(例如立方体贴图的所有面),可以do that with glClearTexImage
。