2012-04-10 229 views
0

考慮以下代碼:執行繪製多邊形,當鼠標點擊

#include <stdlib.h> 
#include <stdarg.h> 
#include <GLUT/GLUT.h> 
#include <OpenGL/OpenGL.h> 

double width=600; 
double height=600; 

void processMouse(int button, int state, int x, int y) 
{ 
    glColor4f(1.0,0.0,0.0,0.0); 
    glBegin(GL_POLYGON); 
    glVertex3f(0.0, 0.0, 0.0); 
    glVertex3f(1.0, 0.0, 0.0); 
    glVertex3f(1.0, 1.0, 0.0); 
    glVertex3f(0.0, 1.0, 0.0); 
    glEnd(); 
    glFlush(); 
} 

static void render() 
{ 
    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); 
    glutMouseFunc(processMouse); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc,argv);           
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 
    glutInitWindowSize(width, height); 
    glutCreateWindow("Board"); 
    glutDisplayFunc(render); 
    glutMainLoop(); 
} 

渲染功能,並進行了一次點擊的時候,它應該啓動功能processMouse。 所以,如果點擊鼠標時,所有的窗口應該變成紅色,說明:

glColor4f(1.0,0.0,0.0,0.0); 
    glBegin(GL_POLYGON); 
    glVertex3f(0.0, 0.0, 0.0); 
    glVertex3f(1.0, 0.0, 0.0); 
    glVertex3f(1.0, 1.0, 0.0); 
    glVertex3f(0.0, 1.0, 0.0); 
    glEnd(); 
    glFlush(); 

但是當我點擊鼠標,我注意到一個奇怪的現象:只有窗口的一部分被着色,在底部的部分離開(而不是所有的屏幕)。 窗口仍處於此狀態,直到我打開谷歌瀏覽器窗口。如果我打開谷歌瀏覽器(或其他圖形應用程序),則所有窗口都變爲紅色。 這是爲什麼?我也有更復雜的程序的問題,似乎有時glVertex指令被忽略。如果我嘗試用fprintf調試程序看起來一切正常,一切似乎都像預期的一樣(例如我試圖打印鼠標座標在processMouse函數中,它們都可以),除了我所繪製的內容被忽略。

編輯: 我已經修改這個代碼,但它仍然有同樣的問題:

#include <stdlib.h> 
#include <stdarg.h> 
#include <GLUT/GLUT.h> 
#include <OpenGL/OpenGL.h> 

double width=600; 
double height=600; 
bool down=false;; 

// http://elleestcrimi.me/2010/10/06/mouseevents-opengl/ 


static void render() 
{ 
    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); 
    if(down) 
    { 
     glColor4f(1.0,0.0,0.0,0.0); 
     glBegin(GL_POLYGON); 
     glVertex3f(0.0, 0.0, 0.0); 
     glVertex3f(1.0, 0.0, 0.0); 
     glVertex3f(1.0, 1.0, 0.0); 
     glVertex3f(0.0, 1.0, 0.0); 
     glEnd(); 
     glFlush(); 
    } 
} 

void processMouse(int button, int state, int x, int y) 
{ 
    if(state==GLUT_DOWN) 
    { 
     down=true; 
     glutPostRedisplay(); 
    } 
} 


int main(int argc, char **argv) 
{ 
glutInit(&argc,argv);           
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 
glutInitWindowSize(width, height); 
glutCreateWindow("Board"); 
glutMouseFunc(processMouse); 
glutDisplayFunc(render); 
glutMainLoop(); 
} 

仍然得到只有屏幕紅色的一部分。

PS:解決使用glutSwapBuffers(),謝謝。

+0

我無法在代碼中的任何位置找到'down = false'。這意味着即時繪圖完全是_once_。 – 2012-04-10 03:13:33

+0

在第一個聲明中:bool down = false,是的目標是隻做一次。 – 2012-04-10 10:19:48

回答

1

當您在GLUT中使用雙緩衝時,您需要調用glutSwapBuffers()來查看繪圖的結果。

添加到您的render()功能的末尾,它會正常工作。

+0

我修改了代碼(請參閱編輯),但我仍然遇到同樣的問題。 – 2012-04-10 02:30:58