Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么添加颜色附件会导致速度降低3倍?_C++_Opengl_Framebuffer_Fbo - Fatal编程技术网

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性能问题一样,它们依赖于实现。因此,我们只能猜测,除非我们知道实际的实现是如何工作的

  • GPU通常针对仅深度渲染进行优化。由于要添加颜色附件,因此不再进行仅深度渲染
  • 您的颜色附件格式为
    GL\u R32F
    。此格式的渲染速度很可能比常规的旧
    GL_RGBA8
    格式慢
  • 如果每次切换到随机选择的64x64阴影贴图时都更改渲染目标,这将非常缓慢。更改渲染目标是一项非常昂贵的操作,但有一些方法可以解决此问题。见本演示文稿第29页:
  • 如果我理解正确,您正在渲染大量的1像素三角形。这很慢。这是因为GPU以2x2像素为一组对像素进行光栅化。即使仅渲染一个像素,硬件仍将运行着色器4次,然后仅丢弃3个像素。如果渲染的都是1像素三角形,则实际上浪费了光栅化性能的3/4
  • 请问您为什么使用深度附件格式
    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。更改深度缓冲区格式时看不到差异的原因很可能是因为无论您指定什么,深度缓冲区格式都会返回到特定的格式。“然后缩放和偏移到相应的瓷砖”你的瓷砖都在一个纹理上还是在单独的纹理上?这真的让人困惑。在您的问题中,您表示您尝试渲染成多个小平铺,而不是一个大阴影贴图。你是说你把整个阴影贴图当作一个单独的平铺?如果渲染到单个平铺,分布是否不那么随机?我认为您的“随机”方法会导致一个问题:缓存未命中。大量缓存未命中。这可能会导致性能严重下降。