为什么添加颜色附件会导致速度减慢3倍

Why does adding a color attachment cause a 3x slowdown?

本文关键字:速度 3倍 添加 颜色 为什么      更新时间:2023-10-16

我对一些模型的深度渲染如下:

m_fbo = new globjects::Framebuffer();
depthBuffer = globjects::Texture::createDefault();
depthBuffer->storage2D(1, GL_DEPTH_COMPONENT32F, size, size);
m_fbo->attachTexture(GL_DEPTH_ATTACHMENT, depthBuffer);
m_fbo->bind();
... draw all the things

现在,当我添加一个颜色附件时,它是这样的:

m_fbo = new globjects::Framebuffer();
depthBuffer = globjects::Texture::createDefault();
depthBuffer->storage2D(1, GL_DEPTH_COMPONENT32F, size, size);
m_fbo->attachTexture(GL_DEPTH_ATTACHMENT, depthBuffer);
attributeBuffer = globjects::Texture::createDefault();
attributeBuffer->storage2D(1, <format>, size, size);
m_fbo->attachTexture(GL_COLOR_ATTACHMENT0, attributeBuffer);
m_fbo->bind();
... draw all the things

根据属性缓冲区的格式,渲染时间从2.6ms变为5ms(R8、RG8)、8.5ms(RGB8、RGBA8、R32F)或14.5ms(RG32F、RGBA32F)(使用opengl计时器查询测量)。

我甚至没有更改片段着色器,所以我不计算任何额外的值来写入颜色缓冲区。如果我注释掉attachTexture行,则渲染时间再次下降。

手头的纹理是2Kx2K阴影贴图图集。我使用的程序镶嵌模型,将每个三角形转换为一个点,并将gl_PointSize=1的点渲染为该图集中随机选择的一个64x64瓷砖。镶嵌和几何着色器都很重,所以我不认为这是带宽或填充率限制。如果我渲染到一个大的阴影贴图而不是多个小的阴影贴图中,这种减速会小得多(1.9到2.1ms)。

如果我在几何着色器中使用imageStore手动将属性写入纹理,并且不使用颜色附件,则速度减慢也是合理的(1.9到2.3ms)

此外,当我开始用nsight跟踪时,这种减速神秘地消失了,这使得无法对此进行分析。

你知道为什么会发生这种事吗?

我使用的是750钛

与大多数OpenGL性能问题一样,它们依赖于实现。因此,我们只能猜测,除非我们知道实际的实现是如何工作的。

  1. GPU通常针对仅深度渲染进行优化。由于添加了颜色附件,因此不再执行仅深度渲染
  2. 您的彩色附件格式为GL_R32F。此格式的渲染速度很可能比常规的旧GL_RGBA8格式慢
  3. 如果每次切换到随机选择的64x64阴影贴图时都更改渲染目标,则速度非常慢。更改渲染目标是一项非常昂贵的操作,但有一些方法可以解决。请参阅本演示文稿的第29页:http://http.download.nvidia.com/developer/presentations/2005/GDC/OpenGL_Day/OpenGL_FrameBuffer_Object.pdf
  4. 如果我理解正确的话,你正在渲染很多1像素的三角形。这很慢。这是因为GPU将像素光栅化为2x2像素的组。即使只有一个像素被渲染,硬件仍然会运行着色器4次,然后只丢弃3个像素。如果所有渲染的都是1像素三角形,那么实际上浪费了光栅化性能的3/4

请问您为什么使用深度附件格式GL_DEPTH_COMPONENT32F?大多数GPU甚至不支持32位深度缓冲区。通常为24位。您是否尝试使用GL_DEPTH_COMPONENT24GL_DEPTH_COMPONENT32

不过,这是一个非常特殊的问题。你有没有尝试更新你的GPU驱动程序?

相关文章: