1

我已经在简单的立即模式下使用 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())。我不会为每一帧创建一个列表。

4

2 回答 2

5

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

相反,您应该通过将数据放入 VBO 并使用glDrawArrays.

于 2015-01-20T15:34:10.137 回答
3

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

于 2015-01-20T15:34:17.660 回答