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

时间:2015-01-20 15:16:50

标签: c++ opengl obsolete displaylist

我已经在简单的立即模式下使用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等来完成其余的工作......)以避免每次帧更新中的三角运算,或者根本没有性能增益? / p>

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

2 个答案:

答案 0 :(得分:5)

显示列表(以及它提供的即时模式呈现)是古老的弃用功能,底层机制由驱动程序决定,有些可能将其备份到绘图数组调用,而其他人只是用参数重放调用它得到了,你的代码实际上没有重新执行。

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

答案 1 :(得分:3)

只有GL命令序列和参数被&#34;烘焙&#34;进入显示列表。否则,OpenGL必须使用某种可怕的longjmp()怪物来重新执行(以及此时的完整的进程状态!)glNewList() / {{之间的代码1}}。