显示列表中的 GLU 二次曲线?
Posted
技术标签:
【中文标题】显示列表中的 GLU 二次曲线?【英文标题】:GLU quadrics in display lists? 【发布时间】:2020-09-24 01:47:10 【问题描述】:我不知道为什么当我运行此代码并使用菜单时,我在屏幕上看不到任何形状。当我用 glu[insertshape] 和相同的参数替换 glCallLists 行时,它可以完美运行,但代码行完全相同,但这次通过显示列表调用,它不起作用。
我什至用打印语句检查,代码肯定正在运行
谁能帮忙?
#include <GL/freeglut.h>
#include <GL/gl.h>
#include <cstdio>
GLUquadricObj* ptrSphere;
GLUquadricObj* ptrCylinder;
GLUquadricObj* ptrDisk;
GLUquadricObj* ptrPartDisk;
GLuint sphereListID;
GLuint cylinderListID;
GLuint diskListID;
GLuint partialDiskListID;
GLuint menuID;
GLuint currentListID;
void drawSphere()
gluSphere(ptrSphere, 2, 25, 25);
printf("sphere");
void drawCylinder()
gluCylinder(ptrCylinder, 3, 3, 4, 25, 25);
printf("cylinder");
void drawDisk()
gluDisk(ptrDisk, 1.5, 3, 25, 25);
printf("disk");
void drawPartDisk()
gluPartialDisk(ptrPartDisk, 1.5, 3, 25, 25, 0, 90);
printf("part disk");
void initQuadrics()
ptrSphere = gluNewQuadric();
gluQuadricDrawStyle(ptrSphere, GLU_LINE);
ptrCylinder = gluNewQuadric();
gluQuadricDrawStyle(ptrCylinder, GLU_LINE);
ptrDisk = gluNewQuadric();
gluQuadricDrawStyle(ptrDisk, GLU_LINE);
ptrPartDisk = gluNewQuadric();
gluQuadricDrawStyle(ptrPartDisk, GLU_LINE);
void initLists()
sphereListID = glGenLists(0);
cylinderListID = glGenLists(0);
diskListID = glGenLists(0);
partialDiskListID = glGenLists(0);
glNewList(sphereListID, GL_COMPILE);
drawSphere();
glEndList();
glNewList(cylinderListID, GL_COMPILE);
drawCylinder();
glEndList();
glNewList(diskListID, GL_COMPILE);
drawDisk();
glEndList();
glNewList(partialDiskListID, GL_COMPILE);
drawPartDisk();
glEndList();
currentListID = sphereListID;
void myMenu(int value)
switch(value)
case(1):
currentListID = sphereListID;
break;
case(2):
currentListID = cylinderListID;
break;
case(3):
currentListID = diskListID;
break;
case(4):
currentListID = partialDiskListID;
break;
glutPostRedisplay();
void initMenu()
menuID = glutCreateMenu(myMenu);
glutSetMenu(menuID);
glutAddMenuEntry("Sphere", 1);
glutAddMenuEntry("Cylinder", 2);
glutAddMenuEntry("Disk", 3);
glutAddMenuEntry("Partial Disk", 4);
glutAttachMenu(GLUT_RIGHT_BUTTON);
void init()
initQuadrics();
initLists();
initMenu();
void display()
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glCallList(currentListID);
glutSwapBuffers();
void reshape(int w, int h)
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-4.0,4.0,-4.0,4.0,-4.0,4.0);
int main(int argc, char** argv)
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("OpenGL - First window demo");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
init();
glutMainLoop();
return 0;
【问题讨论】:
【参考方案1】:我不确定这是否是 OPs 程序中唯一的问题,但肯定是一个:
void initLists()
sphereListID = glGenLists(0);
cylinderListID = glGenLists(0);
diskListID = glGenLists(0);
partialDiskListID = glGenLists(0);
文档。的glGenLists() 对此非常明确:
glGenLists
有一个参数,范围。它返回一个整数 n 以便创建 range 连续的空显示列表,命名为 n, n + 1 , ... , n + range - 1 。 如果范围为0,如果没有可用的范围连续名称组,或者如果产生任何错误,不产生显示列表,返回0 .
(强调我的。)
所以,我会推荐:
使用glGenLists(1)
而不是glGenLists(0)
(或者甚至使用单个glGenLists(4)
一次生成所有列表ID)。
检查glGenLists()
的返回值不为0。
在切换到 OpenGL 3+ 之前,我们使用显示列表来提高视觉模拟应用程序的性能。效果非常好(我们甚至很难在 OpenGL 3+ 中使用缓冲区和着色器获得相同的性能)。
使用显示列表仍然适用于最近的专业(昂贵)显卡。在(便宜得多的)消费类显卡上,我们注意到旧代码的性能下降令人不满意,而仅使用 OpenGL 3+ 函数时我们实现了可比的性能。
【讨论】:
@phantomheartsdev 不客气。你介意accept the answer吗?以上是关于显示列表中的 GLU 二次曲线?的主要内容,如果未能解决你的问题,请参考以下文章
UG NX二次开发(C#)-外部模式-批量删除某些图层中的体对象和曲线对象