我很好奇OpenGL如何分配多个显示列表ID。
目前我有:
void MyCreateList() {
MyListID = glGenLists(1);
glNewList(MyListID, GL_COMPILE);
//gluSphere(qobj, 1.0, 20, 20); //Sphere
//gluCylinder(qobj, 1.0, 0.0, 2.0, 20, 8); //Cylinder
gluDisk(qobj, 0.25, 1.0, 20, 3); //Disk
//gluPartialDisk(qobj, 0.5, 1.0, 26, 13, 0, 180); //PartialDisk
glEndList();
}
=〉一个显示列表的ID。
void MyCreateList() {
GLuint listOne, listTwo, listThree, listFour;
listOne = glGenLists(4);
listTwo = listOne + 1;
listThree = listTwo + 1;
listFour = listThree + 1;
glNewList(listThree, GL_COMPILE);
gluSphere(qobj, 1.0, 20, 20); //Sphere
gluCylinder(qobj, 1.0, 0.0, 2.0, 20, 8); //Cylinder
gluDisk(qobj, 0.25, 1.0, 20, 3); //Disk
gluPartialDisk(qobj, 0.5, 1.0, 26, 13, 0, 180); //PartialDisk
glEndList();
}
=〉多个显示列表的ID。
以下是所需的结果:
如果您使用“显示列表”仅分配一个ID,则不会出现问题,但如果您分配多个ID,则无法正常工作。
有什么想法吗?
1条答案
按热度按时间gopyfrb31#
显示列表将一系列OpenGL命令和数据分组,以便在初始创建后可以重复执行,从而提高程序的性能(有关显示列表的详细信息以及各种代码示例,请参阅here)。
请注意,显示列表在OpenGL 3.0中已被弃用,在OpenGL 3.1中已被删除,此处已对此进行了讨论:Why were display lists deprecated in opengl 3.1?
第二个代码片段中的四个
glu*()
调用创建了图元,这些图元仅存储在生成的四个显示列表中的一个列表中,即listThree
中。在该显示列表中,球体、圆柱体、圆盘和部分圆盘被放置在相同的位置,因此将重叠。此外,四个显示列表ID变量listOne, listTwo, listThree, listFour
对于函数MyCreateList()
的作用域是局部的,因此在函数调用之后它们将不可访问。如果程序应该从发布的screenshot生成结果,那么只需要一个shape(用
gluDisk()
生成)和一个显示列表。(为什么要为该任务使用多个显示列表?)如果这是一个教育性的练习,我认为它是关于将转换放入一个显示列表中,以生成显示的倾斜的scape,例如下面这样(磁盘用
glScalef()
拉伸,用glRotatef()
旋转):这里是一个修改后的示例,它说明了多个显示列表的使用:
所有使用的GL/GLU函数的文档可在以下位置找到:
https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/
所有使用的GLUT函数的文档都可以在以下位置找到:
https://www.opengl.org/resources/libraries/glut/spec3/spec3.html
有关“传统OpenGL”主题的更多信息,请访问here。