【发布时间】:2010-06-20 13:23:48
【问题描述】:
我正在使用 OpenGL 绘制 2D 形状。他们没有使用那么多多边形。我注意到我可以有很多很多的形状,只要它们不重叠。如果我得到一个形状后面的形状……等等……它真的开始滞后。我觉得我可能做错了什么。这是正常的吗,有没有办法解决这个问题(我不能省略渲染,因为我为 alpha 进行了混合)。我还启用了 CW 背面剔除。
谢谢
【问题讨论】:
标签: c++ c optimization opengl
我正在使用 OpenGL 绘制 2D 形状。他们没有使用那么多多边形。我注意到我可以有很多很多的形状,只要它们不重叠。如果我得到一个形状后面的形状……等等……它真的开始滞后。我觉得我可能做错了什么。这是正常的吗,有没有办法解决这个问题(我不能省略渲染,因为我为 alpha 进行了混合)。我还启用了 CW 背面剔除。
谢谢
【问题讨论】:
标签: c++ c optimization opengl
您的两种情况(重叠和不重叠)是否使用完全相同的一组形状?因为如果重叠情况涉及的所有形状的总面积大于第一种情况,那么预计会更慢。如果同一组形状在其中一些重叠时会减慢速度,那么这将是非常不寻常的,并且不应该在任何标准硬件 OpenGL 实现上发生(您使用的是什么平台?)。背面剔除不会造成任何问题。
每当绘制一个形状时,GPU 必须为它在屏幕上覆盖的每个像素做一些工作。如果您在同一个地方绘制相同的形状 100 次,那么这就是像素工作的 100 倍。如果您以深度排序的顺序绘制对象,深度缓冲可以减少不透明对象的一些额外成本,但该技巧不适用于使用透明度的对象。
使用透明度时,重要的是每个渲染形状的面积总和。不是渲染完所有内容后覆盖的屏幕数量。
【讨论】:
如果形状不透明,您需要从前到后排序。然后深度测试可以快速轻松地拒绝每个像素。
然后,如果它们是透明的,您需要将它们从后到前排列。无序渲染透明度非常慢。
编辑:嗯,我(不知何故)错过了这是 2D 的事实,尽管 OP 反复提到它。
【讨论】: