【问题标题】:2D OpenGL scene slows down with lots of overlapping shapes2D OpenGL 场景因大量重叠形状而变慢
【发布时间】:2010-06-20 13:23:48
【问题描述】:

我正在使用 OpenGL 绘制 2D 形状。他们没有使用那么多多边形。我注意到我可以有很多很多的形状,只要它们不重叠。如果我得到一个形状后面的形状……等等……它真的开始滞后。我觉得我可能做错了什么。这是正常的吗,有没有办法解决这个问题(我不能省略渲染,因为我为 alpha 进行了混合)。我还启用了 CW 背面剔除。

谢谢

【问题讨论】:

    标签: c++ c optimization opengl


    【解决方案1】:

    您的两种情况(重叠和不重叠)是否使用完全相同的一组形状?因为如果重叠情况涉及的所有形状的总面积大于第一种情况,那么预计会更慢。如果同一组形状在其中一些重叠时会减慢速度,那么这将是非常不寻常的,并且不应该在任何标准硬件 OpenGL 实现上发生(您使用的是什么平台?)。背面剔除不会造成任何问题。

    每当绘制一个形状时,GPU 必须为它在屏幕上覆盖的每个像素做一些工作。如果您在同一个地方绘制相同的形状 100 次,那么这就是像素工作的 100 倍。如果您以深度排序的顺序绘制对象,深度缓冲可以减少不透明对象的一些额外成本,但该技巧不适用于使用透明度的对象。

    使用透明度时,重要的是每个渲染形状的面积总和。不是渲染完所有内容后覆盖的屏幕数量。

    【讨论】:

    • 如果我在自身顶部有相同的形状 100 倍于 100 个副本彼此相隔 5 个单位。
    • 您使用的是什么硬件/驱动程序?这不应该发生在任何硬件加速的 GL 实现中。除非您的非重叠案例将您的一些形状移出窗口边缘,因为 GPU 可以跳过视锥体外对象的一些工作。
    【解决方案2】:

    如果形状不透明,您需要从前到后排序。然后深度测试可以快速轻松地拒绝每个像素。

    然后,如果它们是透明的,您需要将它们从后到前排列。无序渲染透明度非常慢。

    编辑:嗯,我(不知何故)错过了这是 2D 的事实,尽管 OP 反复提到它。

    【讨论】:

    • 它们按绘制顺序排列,考虑到我正在绘制 2D 形状,是否应该启用深度缓冲区?
    • 我在做 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    • 在任何类型的台式计算机上,在启用深度检查的情况下从前到后绘制不透明对象会更快。但是透明对象总是需要从后向前绘制,并且不会从深度缓冲中受益。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多