考慮以下代碼:執行繪製多邊形,當鼠標點擊
#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(),謝謝。
我無法在代碼中的任何位置找到'down = false'。這意味着即時繪圖完全是_once_。 – 2012-04-10 03:13:33
在第一個聲明中:bool down = false,是的目標是隻做一次。 – 2012-04-10 10:19:48