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

jma*_*erx 5 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();
}
Run Code Online (Sandbox Code Playgroud)

这只有50个多边形,而且已经很慢了.我无法将它们直接上传到卡片中,因为我的程序将允许用户重新整形顶点.

我的问题是,我怎样才能加快速度.我没有使用深度.我也知道这不是我的GetCamera()函数,因为如果我创建500,000个多边形分开t很好,它只是在视图中显示它们有困难.如果显卡每秒可以支持500,000,000个屏幕多边形,这应该很容易吗?

谢谢

Kor*_*icz 15

  1. 如前所述,不要在循环中执行glBegin和glEnd,而是在外部
  2. 为了更好的性能使用顶点数组
  3. 为了获得最佳性能,请使用顶点缓冲对象

这些解决方案按照您将获得多少速度的顺序排序,并且反过来支持它们的宽度.也就是说,任何现代显卡都支持所有这些 - 在编写嵌入式OpenGL系统时只需要小心.

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

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

祝好运!

  • @Jerry Coffin:我几乎考虑过对你喜欢的答案进行投票.在OpenGL 3.1核心及更高版本中删除了不使用缓冲区对象的显示列表和顶点数组*.为什么我们坚持教人们使用传统的OpenGL功能? (2认同)