2014-11-02 21 views
0

Я пытаюсь нарисовать несколько треугольников в 3d и не могу выполнить функцию glutDisplayFunc(). Вот мой код:OpenGL C++ Аргумент типа void несовместим с параметром типа void (*)()

Array из треугольников и размера.

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() функция без аргументов отлично работает.

ответ

1

glutDisplayFunc только разрешить функцию с этой сигнатурой: void func (void).

так в вас код, ваша рутина рисунок должен быть:

недействительным Draw1 (Недействительными) {...}

и вы должны найти другой способ (глобальную переменную, например) в передайте ему параметры. И ваше заявление о перенасыщении будет:

glutDisplayFunc (Draw1);

+1

Он отлично работает, спасибо. – user3051029

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, что вы должны использовать глобалам для передачи данных вокруг обратных вызовов

+0

Хорошо, спасибо. Теперь это работает. – user3051029

+0

@ratchetfreak вы можете исправить это 'glutDisplayFunc (Draw1()); 'to' glutDisplayFunc (Draw1); 'или' glutDisplayFunc (& Draw1); 'чтобы не путать будущий читатель – PeterT

+0

@PeterT Да, я это заметил. В любом случае, спасибо. – user3051029

Смежные вопросы