使用OpenGL创建多个多边形很慢?

时间:2010-05-23 15:20:46

标签: c++ c opengl

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

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个多边形分开t很好,它只是在视图中显示它们有困难。如果显卡每秒可以支持500,000,000个屏幕多边形,这应该很容易吗?

由于

1 个答案:

答案 0 :(得分:14)

  1. 如前所述,不要在循环中执行glBegin和glEnd,而是在
  2. 之外
  3. 为了更好的使用效果vertex arrays
  4. 以获得最佳效果vertex buffer objects
  5. 解决方案按照您将获得多少速度来获得,并且反过来支持它们的宽度。也就是说,任何现代显卡都支持所有这些 - 在编写嵌入式OpenGL系统时只需要小心。

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

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

    祝你好运!