Нарисуйте фигуру в режиме GLUT_DOUBLE

0

У меня есть код:

#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, у кого есть решение для этого.
Спасибо за помощь!

Теги:
draw
mouse
mousemove
glut

1 ответ

1
Лучший ответ

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню