2014-09-20 3 views
0

У меня есть код:Нарисуйте форму с GLUT_DOUBLE режимом

#include <gl/glut.h> 
#include <stdio.h> 

#define WinW 1000 
#define WinH 500 
/* ----------------------------------------------------------------------- */ 

bool mousedown = false; 

void myInit(void) { 
    glClearColor(1.0, 1.0, 1.0, 0.0); 
    glColor3f(1.0, 0.0, 0.0); 
    glPointSize(5.0); 
    glShadeModel(GL_SMOOTH); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0.0, WinW, WinH, 0.0, -1.0, 1.0); 
} 

void myDisplay(void) { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glBegin(GL_POINTS); 
    glColor3f(1.0, 0.0, 0.0); 
    glVertex2i(50, 50); 
    glEnd(); 

    //glFlush(); 
    glutSwapBuffers(); 
} 
void myMouse(int button, int state, int x, int y){ 
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){ 
     mousedown = true; 
    } 
    else 
     mousedown = false; 
} 
void myMovedMouse(int mouseX, int mouseY){ 
    if (mousedown){ 
     //printf("%d %d\n", mouseX, mouseY); 
     glBegin(GL_POINTS); 
     glColor3f(0.0, 1.0, 0.0); 
     glVertex2i(mouseX, mouseY); 
     glEnd(); 

     //glFlush(); 
     glutSwapBuffers(); 
    } 
} 

/* ----------------------------------------------------------------------- */ 

int main(int argc, char *argv[]) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowSize(WinW, WinH); 
    glutInitWindowPosition(100, 150); 
    glutCreateWindow("Computer Graphic"); 

    myInit(); 
    glutDisplayFunc(myDisplay); 
    glutMouseFunc(myMouse); 
    glutMotionFunc(myMovedMouse); 

    glutMainLoop(); 
} 

Я хочу нарисовать произвольную форму с помощью перетаскивания мышью.
Я попробовал glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB) и glFlush(), он работает для меня.
Но когда я использую GLUT_DOUBLE и glutSwapBuffers() в myMovedMouse(), экран мигает (черно-белый-черно-белый ...)
Я новичок в OpenGL, у кого есть решение для этого.
Спасибо за помощь!

ответ

1

При использовании двойной буферизации вы должны нарисовать все свои точки на каждом перерисовке. Поэтому вам нужно вести список всех пунктов. Затем выполняются следующие шаги:

  1. При запуске создайте пустой список точек. Если вам нужен хороший код, определите класс/структуру, который содержит два значения для позиции x и y, и используйте контейнер C++, например std::vector, для вашего списка пунктов.

  2. Когда вы получаете новую точку с ввода мыши, добавьте эту точку в список точек и вызовите glutPostRedisplay().

  3. В функции myDisplay() нарисуйте все точки в списке.

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