使用OpenGL创建许多多边形会变慢吗?

5

我想在屏幕上绘制许多多边形,但很快就注意到它会迅速变慢。作为一个测试,我做了这个:

for(int i = 0; i < 50; ++i)
{
        glBegin( GL_POLYGON);
        glColor3f( 0.0f, 1, 0.0f ); glVertex2f( 500.0 + frameGL.GetCameraX(), 0.0f + frameGL.GetCameraY());
        glColor3f( 0.0f, 1.0f, 0.0f ); glVertex2f( 900.0 + frameGL.GetCameraX(), 0.0f + frameGL.GetCameraY());
        glColor3f( 0.0f, 0.0f, 0.5 ); glVertex2f(900.0 + frameGL.GetCameraX(), 500.0f + frameGL.GetCameraY() + (150));
        glColor3f( 0.0f, 1.0f, 0.0f ); glVertex2f( 500 + frameGL.GetCameraX(), 500.0f + frameGL.GetCameraY());
        glColor3f( 1.0f, 1.0f, 0.0f ); glVertex2f( 300 + frameGL.GetCameraX(), 200.0f + frameGL.GetCameraY());
        glEnd();
}

这只有50个多边形,但已经开始变慢了。我不能直接上传它们到卡片上,因为我的程序将允许用户重新塑造顶点。

我的问题是,如何加速这个过程。我没有使用深度。我也知道不是我的GetCamera()函数的问题,因为如果我创建500,000个多边形并分散开来,它就没问题了,只是在视图中显示它们有困难。如果一个显卡可以每秒支持500,000,000个屏幕上的多边形,那应该很容易对吧?

谢谢

1个回答

15
  1. 如已经提到的,请不要在循环内使用glBegin和glEnd,而是在外部使用
  2. 为了更好的性能,使用顶点数组
  3. 为了获得最佳性能,请使用顶点缓冲对象

这些解决方案按照它们能够带来的速度提升程度进行排序,反之亦然。话虽如此,任何现代显卡都支持所有这些技术 -- 只需在编写嵌入式OpenGL系统的代码时小心即可。

当代游戏(那些达到您所引用的500kk限制的游戏)至少都使用VBO(如果不是几何着色器,但那甚至比VBO还要高级一步)。为了有效地学习所提到的技术,我真诚地建议逐个掌握它们 -- 例如,先学习显示列表,然后是顶点数组,再然后是VBO,因为实际上每一个技术都是在前面的基础上构建的。

立即模式(特点是每个对象使用一个GL命令)非常慢,甚至在当前的GL标准中已经被弃用 -- 简而言之,这是因为除了纹理操作之外最昂贵的图形操作之一是绘制调用 -- 显卡和处理器之间的调用 -- 因此在实践中最好尽可能地预先准备好所有内容,并在一个调用(或尽可能少的调用)中提交给GPU。

祝你好运!


VBOs建立在顶点数组的基础上,但不建立在显示列表上。你可以放心地跳过关于显示列表的学习,或者简单浏览一下,这样你就会知道何时使用它们。 - Thomas
2
@Jerry Coffin:我几乎考虑给这个答案点个踩,原因和你喜欢它的一样。在OpenGL 3.1核心版本及以后,已经移除了不使用缓冲对象的显示列表和顶点数组功能。为什么我们还要坚持教人们使用过时的OpenGL功能呢? - Mads Elvheim
@Mads,我不混淆它们,但99%的人问OpenGL时会混淆。 - Kornel Kisielewicz
@Mads:基本上,你在说Khronos负责,而程序员应该听从他们的命令。在我看来,相反的是真实的:至少按权利讲,程序员应该主导,并且Khronos(和其他标准制定者)应该为他们服务。 - Jerry Coffin
1
显示列表正在逐渐被淘汰,您可以安全地跳过它们而不会错过任何东西(它们不是OpenGL ES或OpenGL 3.0的一部分)。现在使用VBOs以外的任何东西都没有道理。 - Andreas Brinck
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接