0

我有一些这样的代码

      glNewList(displist_boxy, GL_COMPILE);


      for(int i=0; i<scene_max; i++)
      {
        DrawAABox( sceneGL[i].x,
                sceneGL[i].y,
                sceneGL[i].z,
                10,10,10
                 );
      }

     glEndList();

DrawAABox 绘制 6 个四轴对齐的框(使用 glBegin glNormal GlVertexx ... glEnd)它在立即模式下工作,但是当我尝试像上面那样构建一个显示列表时,然后调用它没有效果的列表(没有画框)应该工作或者这不应该工作(我不太了解它)

4

3 回答 3

2

显示列表将块内完成的所有 OpenGL 操作提炼glNewList/glEndList成一组恒定的命令,然后在调用显示列表时执行这些命令(带有glCallList)。这意味着列表创建中的每个“动态”代码都被编译到列表中。所以当你调用你的盒子时,你的盒子将使用sceneGL[i]你建立列表时的任何位置。实际上,您将只有一个恒定数量的框,即scene_max构建列表时的任何数量。因此,如果您在初始化代码中执行此操作,scene_max可能在哪里0,则不会绘制任何内容。

想一想,在构建这个列表时,驱动程序可能会做什么?只需记录所有调用的 OpenGL 命令(并可能将它们转换为某种压缩和优化的格式)以供以后提交,或者在运行时神奇地从最终可执行文件中获取已执行的机器代码(及其整个周围的上下文)并以某种方式存储它以调用您的每个操作之间做了glNewList/glEndList(无论如何,与立即执行相比,这不会有太大的性能提升)?

编辑:作为旁注,宁愿使用 VBO 来预先记录几何图形,与显示列表相比,它可能会丢失一些功能,例如状态更改记录,但会给您其他功能,例如动态数据更新。同样,显示列表的实现完全取决于实现,可能不会比 VBO 等更快。同样,它们已被弃用(这也可能说明现代硬件上的糟糕/缓慢的实现,因为驱动程序并不倾向于很好地优化很少使用的路径)。

于 2012-11-02T08:58:49.917 回答
1

要创建显示列表,您必须首先创建并绑定目标 OpenGL 上下文。如果您碰巧在 OpenGL 上下文之前调用的代码中初始化了显示列表,则以后不会显示任何内容。

还有 Christian Rau 在https://stackoverflow.com/a/13192138/524368中告诉你的内容

附带说明:您根本不应该使用显示列表。它们已经被弃用了大约 10 年(OpenGL-2 最初计划取消显示列表),而 OpenGL-3 在五年后继续使用它。

请改用 VBO 和 VAO。

于 2012-11-02T09:01:45.103 回答
1

您似乎错过了为displist_boxy变量生成 UID。这是它的外观。

coAxis := glGenLists(1);
glNewList(coAxis, GL_COMPILE);
  glBegin(GL_TRIANGLES);
    ...
  glEnd;
glEndList;

用法如下:

glCallList(coAxis);
于 2012-11-02T08:45:04.430 回答