【发布时间】: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