почему не отображается в openGL? - PullRequest
0 голосов
/ 02 сентября 2011
int main(int argc,char * argv[]){
    srand(time(NULL));
    glutInit(&argc,argv);

    // Setup GLUT
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB     | GLUT_DEPTH | GLUT_STENCIL);
    glutInitWindowSize (window_width,window_height);
    glutCreateWindow (window_title);
    graphics_init ();

    // Initialize Runtime variables
    initialize();

    // callbacks
    glutReshapeFunc(&reshape);
    glutDisplayFunc(&display);
    glutMouseFunc(&mouse);
    glutMainLoop();
    return 0;
}


void mouse(int button, int state, int x, int y ){
    if(state == GLUT_DOWN){
         draw_method_two(); // draw objects here using method 2
            glFlush();

    }else{
        current_point_i = -1;
    }
}

void display(){
    // Clear Viewport
    glClearColor(0.0f,0.0f,0.0f,1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    draw_method_one(); ///// using method 1 to draw objects

    glFlush();
    glutSwapBuffers();

}

Существует два способа рисования объектов. в mouse(), draw_objects_two используется для рисования объектов при щелчке мышью. Тем не менее, объекты, показанные в окне, по-прежнему создаются draw_method_one. Я использую glFlush в функции mouse(). но почему это не отображается на экране?

Обновление:

из этой ссылки написано:

The function you pass to glutDisplayFunc is only called it is needed: that means when the window is resized, or when an another window has hidden it. If you use glutMouseFunc, for instance, you perhaps want to update (redraw) your window content according to that clic. Also, if you draw animations, you need to call glutPostRedisplay from your idle function.

Так почему glutDisplayFunc() вызывается в этом случае?

Ответы [ 2 ]

4 голосов
/ 02 сентября 2011

В вашей функции мыши ничего не рисуется, потому что вы вызываете только glFlush, но вы не меняете местами буферы (wtih glutSwapBuffers).Поэтому вы рисуете только в задний буфер, который не представлен.В следующий раз, когда GLUT вызывает display, обратный буфер там перезаписывается и, наконец, представляется с помощью вызова glutSwapBuffers.

Но вы все равно не должны рисовать ничего в другом методе, кроме обратного вызова glutDisplayFunc.Просто установите флажок в функции мыши (как предложено ssell) и вызовите glutPostRedisplay.Ваш обновленный вопрос правильный, дисплей вызывается только при необходимости, поэтому вы должны вызывать glutPostRedisplay всякий раз, когда вы что-то меняете и хотите, чтобы это обновляло экран.

И, кстати, вам обычно не нужновызовите glFlush, что уже должно быть выполнено подкачкой буфера.

1 голос
/ 02 сентября 2011

Что происходит, так это то, что, несмотря ни на что, каждый цикл draw_method_one( ) вызывается. Когда вы щелкаете мышью, draw_method_two( ) вызывается только один раз, поэтому во время следующего цикла экран перерисовывается с использованием метода один.

Чтобы получить желаемый результат, сделайте что-то вроде этого:

bool drawFirstMethod = true;

...

void mouse(int button, int state, int x, int y )
{
    //toggle draw modes
    if( state == GLUT_DOWN )
    {
        if( drawFirstMethod )
            drawFirstMethod = false;
        else
            drawFirstMethod = true;
    }

    ...
}

display( )
{
    ...

    if( drawFirstMethod )
        draw_method_one( );
    else
        draw_method_two( );

    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...