为什么添加颜色附件会导致速度减慢3倍
Why does adding a color attachment cause a 3x slowdown?
我对一些模型的深度渲染如下:
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性能问题一样,它们依赖于实现。因此,我们只能猜测,除非我们知道实际的实现是如何工作的。
- GPU通常针对仅深度渲染进行优化。由于添加了颜色附件,因此不再执行仅深度渲染
- 您的彩色附件格式为
GL_R32F
。此格式的渲染速度很可能比常规的旧GL_RGBA8
格式慢 - 如果每次切换到随机选择的64x64阴影贴图时都更改渲染目标,则速度非常慢。更改渲染目标是一项非常昂贵的操作,但有一些方法可以解决。请参阅本演示文稿的第29页:http://http.download.nvidia.com/developer/presentations/2005/GDC/OpenGL_Day/OpenGL_FrameBuffer_Object.pdf
- 如果我理解正确的话,你正在渲染很多1像素的三角形。这很慢。这是因为GPU将像素光栅化为2x2像素的组。即使只有一个像素被渲染,硬件仍然会运行着色器4次,然后只丢弃3个像素。如果所有渲染的都是1像素三角形,那么实际上浪费了光栅化性能的3/4
请问您为什么使用深度附件格式GL_DEPTH_COMPONENT32F
?大多数GPU甚至不支持32位深度缓冲区。通常为24位。您是否尝试使用GL_DEPTH_COMPONENT24
或GL_DEPTH_COMPONENT32
?
不过,这是一个非常特殊的问题。你有没有尝试更新你的GPU驱动程序?
相关文章:
- 将uintptr_t转换为布尔值会使 SSO 基准速度减慢数倍
- GCC 和 LLVM 中的正则表达式速度相差 1000 倍
- MF SinkWriter mp4文件的播放持续时间是添加音频样本时的一半,图像的播放速度也是添加音频样本的两倍
- 无论如何,是否可以使用setCursorPos(int,int)函数,但没有采用两个int使它需要速度较慢的两倍
- 试用版代码在 Windows 上的 32 位运行速度比在 Linux 上的 64 位快 2 倍
- Java使用数组的速度是C++中std::vector的8倍.我做错了什么
- 处理数据的方法,速度是我处理速度的两倍
- 在Visual C++中为几乎相同的代码生成极其奇怪的代码;3倍速度差
- 相同的功能?使用 GMP(C++) 时运行速度慢约 10 倍
- Windows 服务生成的进程的运行速度比 GUI 生成的进程慢 3 到 4 倍
- 运行时间比较 - 类似的代码运行速度慢 4 倍
- 为什么使用MinGW时std::to_string()的运行速度是使用VS2012时的16倍
- c++比c#的计算速度快15倍,这是合法的吗?
- 当我所做的只是将循环代码移动到函数中时,代码运行速度会慢10倍
- 64位向量的点积速度比32位无符号整型向量快两倍
- OpenCL示例程序在CPU上的执行速度是在GPU上的10倍
- 为什么优化标志 (-O3) 不能加快四倍精度计算的速度?
- 为什么添加颜色附件会导致速度减慢3倍
- 为什么 std::vector 的速度是原始数组的两倍?包含完整的代码
- 使用g++ 5.3.1编译的程序比使用g++ 4.8.4(相同的命令)编译的程序运行速度慢3倍