2012-04-10 180 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