OpenGL 显示列表是否烘焙 glVertex 数据?

Does OpenGL display list bake glVertex data?

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

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

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

来明确地进行烘焙

只有GL命令序列和参数"baked"进入显示列表。否则 OpenGL 将不得不使用某种可怕的 longjmp() 怪兽来重新执行(连同当时的 complete 进程状态!)glNewList() 之间的代码/glEndList().