2014-09-20 126 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(),它适合我。
但是,当我在myMovedMouse()中使用GLUT_DOUBLEglutSwapBuffers()时,屏幕闪烁(黑白 - 黑 - 白...)
我是OpenGL的新手,任何人都可以为此提供解决方案。
感谢您的帮助!

回答

1

使用双缓冲时,必须在每次重绘时绘制所有点。所以你必须保留所有点的清单。步骤如下:

  1. 在启动时,创建一个空的点列表。如果你想要很好的代码,定义一个包含x和y位置的两个值的类/结构体,并使用C++容器(如std::vector)作为你的点列表。

  2. 当您从鼠标输入中得到一个新点时,将该点添加到点列表中,并调用glutPostRedisplay()

  3. myDisplay()函数中,绘制列表中的所有点。

与使用单缓冲相比,不得不保持点列表可能会增加复杂性。但是,一旦你走得更远,你可能会需要它。例如,如果用户调整窗口大小,则必须能够重新绘制所有点。因此,在单缓冲模式下逐一绘制点不会让你感觉很差。