【问题标题】:Does OpenGL display list bake glVertex data?OpenGL 显示列表是否烘焙 glVertex 数据?
【发布时间】:2015-03-18 21:21:41
【问题描述】:

我在简单立即模式下使用 OpenGL 已有一段时间了,并试图通过显示列表转到保留模式(遗憾的是,我了解到它已经被弃用了一段时间)。我想知道的是,当我输入:

glNewList(list, GL_COMPILE);
glBegin(GL_TRIANGLE_FAN);
    glVertex2f(0.0f, 0.0f);
    for (int i = 0; i < 10; i++)
    {
        glVertex2f(radius * cos(i * 2.0f * PI / 9.0f), radius * sin(i * 2.0f * PI / 9.0f));
    }
glEnd();
glEndList();

OpenGL 是否会预先计算 for 循环中的所有 10 个顶点并将它们发送到已烘焙的显卡,例如:

glVertex2f(0.5f, 0.0f);
glVertex2f(0.499f, 0.0055f);
//so and so forth 10 times...

或者它是否尝试对每一帧都进行 for 循环(以及许多 sin / cos 操作)?换句话说,将这样的圆形存储在显示列表中(其余的使用 glTranslatef、glRotatef 等)以避免每次帧更新中的三角运算是否合理,或者根本没有性能提升?

编辑:为了避免混淆,我打算使用for循环创建这个显示列表一次,然后在每次帧更新时通过glCallList(list)调用它(即glutDisplayFunc( ))。我不会为每一帧都创建一个列表。

【问题讨论】:

  • 哦,对不起,我没有仔细阅读。算了 ;) 答案是:循环和相关的 sin/cos 只运行一次。显示列表数据何时以及如何存储以及何时到达 GPU 是特定于实现的。另一件事是它完全无关紧要。显示列表是如此缓慢,没有正弦或余弦会变得更接近。您应该直接选择 OpenGL 3+ 书籍/教程。无需学习和调整过时的东西。

标签: c++ opengl obsolete displaylist


【解决方案1】:

显示列表(以及为其提供的即时模式渲染)是古老的已弃用功能,底层机制取决于驱动程序,有些人可能会将其返回到绘制数组调用中,而其他人只会使用它的参数重播调用知道了,实际上没有重新执行您的代码。

相反,您应该通过将数据放入 VBO 并使用 glDrawArrays 来明确地进行烘焙。

【讨论】:

    【解决方案2】:

    只有 GL 命令序列和参数被“烘焙”到显示列表中。否则 OpenGL 将不得不使用某种可怕的 longjmp() 怪物来重新执行(以及当时的 complete 进程状态!)glNewList()/glEndList() 之间的代码。

    【讨论】:

      猜你喜欢
      • 2016-05-03
      • 1970-01-01
      • 2011-12-18
      • 2011-12-24
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多