用 OpenGL 创建许多多边形很慢?

Posted

技术标签:

【中文标题】用 OpenGL 创建许多多边形很慢?【英文标题】:Creating many polygons with OpenGL is slow? 【发布时间】:2010-05-23 15:20:45 【问题描述】:

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

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】:
    如前所述,不要在循环中而是在外部执行 glBegin 和 glEnd 为了获得更好的性能,请使用vertex arrays 为了获得最佳性能,请使用vertex buffer objects

这些解决方案的顺序是按照您将获得多少速度增益,以及它们支持的范围相反。也就是说,任何现代显卡都支持所有这些——您只需要在为嵌入式 OpenGL 系统编码时小心。

当代游戏(达到您引用的 500kk 限制的游戏)都至少使用 VBO(如果不是几何着色器,但那甚至超过了一步)。为了有效地学习上面提到的技术,我真诚地建议一步一步来——例如首先学习显示列表,然后是顶点数组,然后是 VBO,因为实际上每一个都建立在前者之上。

立即模式(通过对每个对象使用 GL 命令来表征)非常慢,甚至在当前的 GL 标准中已被弃用 - 很长的理论,这是因为最昂贵的图形操作之一(除了纹理操作)是绘图调用——显卡和处理器之间的调用——因此在实践中最好提前做好所有准备,并在一次调用中(或尽可能少地)将其提交给 GPU。

祝你好运!

【讨论】:

+1 用于给出有序列表,而不是引用单一可能性作为 解决方案。 VBO 建立在顶点数组上,但不在显示列表上。您可以安全地跳过对显示列表的了解,或简要查看它们,以便了解何时使用它们。 只有一件事,如果我使用 GLU 镶嵌怎么办? @Jerry Coffin:出于同样的原因,我几乎考虑过否决答案。 不使用缓冲区对象的显示列表和顶点数组在 OpenGL 3.1 核心及更高版本中被删除。为什么我们坚持教人们使用传统的 OpenGL 功能? 显示列表正朝着渡渡鸟的方向发展,您可以放心地跳过它们,不会错过任何东西(它们既不是 OpenGL ES 的一部分,也不是 OpenGL 3.0 的一部分)。现在没有理由使用除 VBO 之外的任何东西。

以上是关于用 OpenGL 创建许多多边形很慢?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL中多边形的渐变

OpenGL,如何创建“凹凸不平的多边形”?

使用 OpenGL 3.3 进行实例化似乎很慢

OpenGL--粒子系统

OpenGL - 在鼠标点击时绘制多边形,多边形总是在右边

用鼠标在 OpenGL GLUT 中绘制多边形