C++ 为什么添加颜色附件会导致速度降低3倍?
我只是这样渲染了一些模型的深度:C++ 为什么添加颜色附件会导致速度降低3倍?,c++,opengl,framebuffer,fbo,C++,Opengl,Framebuffer,Fbo,我只是这样渲染了一些模型的深度: 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(); .
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
现在,当我向它添加颜色附件时,如下所示:
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
m_fbo=newglobjects::Framebuffer();
depthBuffer=globjects::Texture::createDefault();
depthBuffer->storage2D(1,GL_DEPTH_component 32f,size,size);
m_fbo->attachTexture(GL_DEPTH_ATTACHMENT,depthBuffer);
attributeBuffer=globjects::Texture::createDefault();
attributeBuffer->storage2D(1,大小,大小);
m_fbo->attachTexture(GL_COLOR_ATTACHMENT0,attributeBuffer);
m_fbo->bind();
... 画所有的东西
根据属性缓冲区的格式,渲染时间从2.6ms到5ms(R8,RG8)、8.5ms(RGB8,RGBA8,R32F)或14.5ms(RG32F,RGBA32F)(使用opengl计时器查询测量)
我甚至没有更改片段着色器,所以我不会计算任何附加值来写入该颜色缓冲区。如果我注释掉attachTexture
行,渲染时间会再次下降
手边的纹理是一个2Kx2K的阴影贴图图集。我使用的程序对模型进行细分,将每个三角形转换为一个点,并将gl_PointSize=1的点渲染为该图集内随机选择的一个64x64平铺。tesselation和geometry shader非常重,所以我不认为这是带宽或填充率限制。如果我渲染成一个大的阴影贴图而不是多个小的阴影贴图,这种减速会小得多(1.9到2.1ms)
如果我在几何体着色器中使用imageStore手动将属性写入纹理,并且不使用颜色附件,则减速也是合理的(1.9到2.3ms)
此外,当我开始使用nsight进行跟踪时,这种减速现象神秘地消失了,这使得无法对此进行分析
你知道为什么会这样吗
我使用的是750 Ti。与大多数OpenGL性能问题一样,它们依赖于实现。因此,我们只能猜测,除非我们知道实际的实现是如何工作的
GL\u R32F
。此格式的渲染速度很可能比常规的旧GL_RGBA8
格式慢GL\u depth\u component 32f
?大多数GPU甚至不支持32位深度缓冲区。通常是24位。您是否尝试使用GL\u DEPTH\u组件24
或GL\u DEPTH\u组件32
但这是一个非常奇怪的问题。您是否尝试过更新您的GPU驱动程序?1:当然,我确实希望性能会受到影响,但不会有这么大的影响。2:我试过其他格式,没有效果。3:所有的阴影贴图都在这个大地图集中,不涉及切换。4:我正在渲染点并将gl_pointSize设置为1。关于浪费光栅化性能的观点可能仍然正确,但在没有颜色附件的情况下也是如此:)5。没有特别的原因。我将尝试24位,但我怀疑它是否会影响颜色缓冲区问题…?深度缓冲区提示只是一个一般提示。这似乎是一个非常奇怪的问题。你确定你正确地衡量了绩效吗?如何仅渲染到阴影贴图的一个区域?通过更改视口?我对格式的理解是错误的,它确实会根据占用的字节数产生巨大的差异,请参见问题。深度缓冲区格式确实没有什么区别。到目前为止,我没有理由怀疑测量结果,我正在使用GL_TIME_passed查询来查询绘图命令。渲染到区域:我有一个投影矩阵数组,在geom着色器中选择并应用其中一个,然后缩放并偏移到相应的平铺中。还要注意问题的另一个方面,手动将属性存储到一个新的缓冲区要比附件快得多…@Karyon:当然,这会产生巨大的差异,因为它会影响bandwith。更改深度缓冲区格式时看不到差异的原因很可能是因为无论您指定什么,深度缓冲区格式都会返回到特定的格式。“然后缩放和偏移到相应的瓷砖”你的瓷砖都在一个纹理上还是在单独的纹理上?这真的让人困惑。在您的问题中,您表示您尝试渲染成多个小平铺,而不是一个大阴影贴图。你是说你把整个阴影贴图当作一个单独的平铺?如果渲染到单个平铺,分布是否不那么随机?我认为您的“随机”方法会导致一个问题:缓存未命中。大量缓存未命中。这可能会导致性能严重下降。