显示列表中的 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#)-外部模式-批量删除某些图层中的体对象和曲线对象

UG NX二次开发(C#)-外部模式-批量删除某些图层中的体对象和曲线对象

svg path中的贝塞尔曲线

ggplot中的多个最小二乘二次拟合

nx二次开发怎么判断选择的曲线是不是有缝隙

我如何摆脱 glu.h 中的这些编译器错误?