2D OpenGL 场景因大量重叠形状而变慢

Posted

技术标签:

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

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

谢谢

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

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

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

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

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

【讨论】:

它们按绘制顺序排列,考虑到我正在绘制 2D 形状,是否应该启用深度缓冲区? 我在做 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 在任何类型的台式计算机上,在启用深度检查的情况下从前到后绘制不透明对象会更快。但是透明对象总是需要从后向前绘制,并且不会从深度缓冲中受益。

以上是关于2D OpenGL 场景因大量重叠形状而变慢的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - 如何使用弹出菜单绘制多个不同的 2D 形状?

OpenGL:渲染具有大量纹理透明度的模型,没有绘制顺序?

NT kernel&system进程占用了很多cpu,电脑运行超慢,CPU经常飚到100%

在 OpenGL 中绘制大量像素

OpenGL:如何在 3d 模式下优化多层相互重叠的 2d 渲染?

在 OpenGL 中绘制 2D 形状的轮廓,同时更改线条粗细