opengl - 使用立方体贴图时 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
);
解决方案
帧缓冲区附有图像。帧缓冲区操作会影响当前附加到它们的图像。
请注意,我说的是“图像”而不是纹理“。纹理包含图像,但就帧缓冲区而言,同一纹理中的不同图像彼此没有关系。帧缓冲区操作仅影响附加到它的图像时间时间。
如果将特定立方体贴图面附加到帧缓冲区,则该面就是附加到 FBO 中该附加位置的图像。对帧缓冲区的操作会影响该图像,但帧缓冲区既不知道也不关心纹理中可能存在的任何其他立方体贴图面。帧缓冲区仅处理当前附加的图像。
此外,如果要清除要用于渲染的帧缓冲区附加图像,则在发出 clear 调用时,必须将要清除的图像附加到 FBO。如果您打算清除要附加的图像,则清除然后附加是没有意义的。
如果要将整个纹理清除为特定值(例如立方体贴图的所有面),可以使用glClearTexImage
.
推荐阅读
- php - PHP:每次运行函数时递增变量
- java - Apache POI 4.0.x 是否支持 Java 11
- mercurial - hg 类似导出的输出,两个修订版之间的所有变更集都折叠成一个?
- postgresql - postgres“强制行级安全”已执行,但相关策略已禁用
- android - java.lang.IllegalStateException:在 android.view.ViewGroup.addViewInner
- xml - 如何在 Odoo 中自定义树视图的 sum 函数?
- reactjs - 如何从 passport.authenticate 中获取成功和错误消息?
- angular - 获取从asp.net web api 2传递的角度标题值
- python-3.x - 输入包含 NaN、无穷大或对于 Tensorflow 中的 dtype('float64') 而言太大的值
- python-3.x - 我将如何使用 python 在 sqlite 中使用 AUTOINCREMENT -