我已经在简单的立即模式下使用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( ))。我没有为每一帧创建一个列表。
答案 0 :(得分:5)
显示列表(以及它提供的即时模式呈现)是古老的弃用功能,底层机制由驱动程序决定,有些可能将其备份到绘图数组调用,而其他人只是用参数重放调用它得到了,你的代码实际上没有重新执行。
相反,您应该通过将数据放入VBO并使用glDrawArrays
来明确地进行烘焙。
答案 1 :(得分:3)
只有GL命令序列和参数被&#34;烘焙&#34;进入显示列表。否则,OpenGL必须使用某种可怕的longjmp()
怪物来重新执行(以及此时的完整的进程状态!)glNewList()
/ {{之间的代码1}}。