我有一个代码:
#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的新手,任何人都有解决方案。
谢谢你的帮助!
答案 0 :(得分:1)
使用双缓冲时,您必须在每次重绘时绘制所有点。所以你必须保持所有点的列表。然后是步骤:
启动时,创建一个空点列表。如果你想要好的代码,定义一个包含x和y位置的两个值的类/结构,并使用像std::vector
这样的C ++容器作为你的点列表。
当您从鼠标输入获得新点时,将该点添加到点列表,然后调用glutPostRedisplay()
。
在myDisplay()
函数中,绘制列表中的所有点。
与使用单缓冲相比,必须维护点列表似乎会增加复杂性。但是一旦你走得更远,你可能还是需要它。例如,如果用户调整窗口大小,则无论如何都必须能够重绘所有点。因此,在单缓冲模式下逐个绘制点不会让你走得太远。