2014-09-20 124 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()函數中,繪製列表中的所有點。

與使用單緩衝相比,不得不保持點列表可能會增加複雜性。但是,一旦你走得更遠,你可能會需要它。例如,如果用戶調整窗口大小,則必須能夠重新繪製所有點。因此,在單緩衝模式下逐一繪製點不會讓你感覺很差。