OpenGL C ++类型的参数与void(*)()类型的参数不兼容

时间:2014-11-02 22:39:57

标签: c++ opengl visual-studio-2012 3d

我试图在3d中绘制几个三角形,但不能执行glutDisplayFunc()功能。这是我的代码:

三角形和大小的数组。

int const trsize = (size-1)*(size-1)*2;
Triangle *trarr = new Triangle[trsize];

代码,我尝试调用该函数。

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,400);        
glutInitWindowPosition(100,100);    
glutCreateWindow("Height Map");     
Initialize();                       
glutDisplayFunc(Draw1(trarr, trsize));              
glutMainLoop();

Draw1()功能。

void Draw1(Triangle arr[], int size){
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
    glBegin(GL_LINES);
    for(int i=0; i<size; ++i){
        glVertex3d((GLdouble)arr[i].p1().x(), (GLdouble)arr[i].p1().y(), (GLdouble)arr[i].p1().z());
        glVertex3d((GLdouble)arr[i].p2().x(), (GLdouble)arr[i].p2().y(), (GLdouble)arr[i].p2().z());
        glVertex3d((GLdouble)arr[i].p3().x(), (GLdouble)arr[i].p3().y(), (GLdouble)arr[i].p3().z());
    }
    glEnd();
    glFlush();
}

我使用VS2012和IntelliSense写道:argument of type "void" is incompatible with parameter of type "void (*)()"

我不知道为什么DisplayFunc需要其他类型。使用没有参数的Draw()函数,它可以正常工作。

2 个答案:

答案 0 :(得分:1)

glutDisplayFunc仅允许具有该签名的函数:void func(void)。

所以在你的代码中,你的绘图程序应该是:

  

void Draw1(void){...}

你应该找到另一种方法(例如全局变量)来传递参数。你的陈述声明将是:

  

glutDisplayFunc(DRAW1);

答案 1 :(得分:0)

这些参数应该是在设置drawFunc时分配给的全局变量:

Triangle arr[];
int size;

void Draw1(){
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
    glBegin(GL_LINES);
    for(int i=0; i<size; ++i){
        glVertex3d((GLdouble)arr[i].p1().x(), (GLdouble)arr[i].p1().y(), (GLdouble)arr[i].p1().z());
        glVertex3d((GLdouble)arr[i].p2().x(), (GLdouble)arr[i].p2().y(), (GLdouble)arr[i].p2().z());
        glVertex3d((GLdouble)arr[i].p3().x(), (GLdouble)arr[i].p3().y(), (GLdouble)arr[i].p3().z());
    }
    glEnd();
    glFlush();
}


Initialize();         
arr = trarr; size = trsize;              
glutDisplayFunc(Draw1);              
glutMainLoop();

它是glut库的一个缺点,你必须使用全局变量来传递回调数据