我有一些类似的代码
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列表时, 然后调用它没有效果的列表(没有绘制框)它应该工作还是这不应该工作(我不太了解它)
答案 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。