显示列表不起作用

时间:2012-11-02 08:23:20

标签: opengl

我有一些类似的代码

      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) 它在立即模式下工作但是当我尝试构建如上所示的disoplay列表时, 然后调用它没有效果的列表(没有绘制框)它应该工作还是这不应该工作(我不太了解它)

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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

用法如下:

glCallList(coAxis);

答案 2 :(得分:1)

要创建显示列表,必须首先创建并绑定目标OpenGL上下文。如果你碰巧在有/ a OpenGL上下文之前调用的代码中初始化显示列表,那么以后什么都不会出现。

Christian Rau在https://stackoverflow.com/a/13192138/524368

中告诉你的是什么

旁注:您根本不应该使用显示列表。它们已经被弃用了大约10年(OpenGL-2最初计划用于取消显示列表),而OpenGL-3则在半年之后推出。

改为使用VBO和VAO。