У меня есть код:
#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, у всех есть решение для этого.
Спасибо за помощь!
При использовании двойной буферизации вы должны рисовать все свои точки на каждом перерисовке. Таким образом, вы должны вести список всех точек. Затем выполняются следующие шаги:
При запуске создайте пустой список точек. Если вы хотите хороший код, определите класс / структуру, которая содержит два значения для позиции x и y, и используйте контейнер C ++, например std::vector
для вашего списка очков.
Когда вы получите новую точку от ввода мышью, добавьте эту точку в список точек и вызовите glutPostRedisplay()
,
в myDisplay()
функция, нарисуйте все точки в списке.
Может показаться, что необходимость поддерживать список точек добавляет сложности по сравнению с использованием одиночной буферизации. Но как только вы пойдете немного дальше, вам, вероятно, все равно это понадобится. Например, если пользователь изменяет размеры окна, вам все равно придется перерисовывать все точки. Так что рисование точек одна за другой в режиме одиночной буферизации не продвинет вас слишком далеко.