glut/openGL 的绘图程序不工作
drawing program with glut/openGL not working
此程序能够创建 window 并在鼠标位于 window 上时定位我的鼠标,但显示功能似乎确实有效。我在这里错过了什么?
float pointSize = 10.0f;
bool leftBottState;
float xvalue;
float yvalue;
void init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
}
void dots()
{
glBegin(GL_POINTS);
glVertex3f(xvalue, yvalue, 0.0);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1, 0, 1);
dots();
glEnd();
glFlush();
}
void mouse(int button, int state, int x, int y)
{
y = 600 - y;
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
leftBottState = true;
}
else
{
leftBottState = false;
}
}
void motion(int x, int y)
{
if (leftBottState)
{
std::cout << "LEFt bUTTON " << std::endl;
xvalue = x;
yvalue = y;
glutPostRedisplay();
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowSize(600, 600);
glutCreateWindow("test");
glutMotionFunc(motion);
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMainLoop();
return(0);
}
您正在使用双缓冲 window(参见 glutInitDisplayMode
)。
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
因此您必须在渲染场景后调用glutSwapBuffers
来交换缓冲区:
void dots()
{
glBegin(GL_POINTS);
glVertex3f(xvalue, yvalue, 0.0);
glEnd();
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1, 0, 1);
dots();
// glFlush();
glutSwapBuffers();
}
注意,glBegin
\ glEnd
序列界定了图元的顶点。我建议在指定顶点之前和之后立即在同一函数中调用此指令。
glClear
清除缓冲区,从而清除整个场景。如果要永久绘制点,则必须从 display
函数中删除 glClear
指令。
glClear(GL_COLOR_BUFFER_BIT);
此程序能够创建 window 并在鼠标位于 window 上时定位我的鼠标,但显示功能似乎确实有效。我在这里错过了什么?
float pointSize = 10.0f;
bool leftBottState;
float xvalue;
float yvalue;
void init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
}
void dots()
{
glBegin(GL_POINTS);
glVertex3f(xvalue, yvalue, 0.0);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1, 0, 1);
dots();
glEnd();
glFlush();
}
void mouse(int button, int state, int x, int y)
{
y = 600 - y;
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
leftBottState = true;
}
else
{
leftBottState = false;
}
}
void motion(int x, int y)
{
if (leftBottState)
{
std::cout << "LEFt bUTTON " << std::endl;
xvalue = x;
yvalue = y;
glutPostRedisplay();
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowSize(600, 600);
glutCreateWindow("test");
glutMotionFunc(motion);
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMainLoop();
return(0);
}
您正在使用双缓冲 window(参见 glutInitDisplayMode
)。
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
因此您必须在渲染场景后调用glutSwapBuffers
来交换缓冲区:
void dots()
{
glBegin(GL_POINTS);
glVertex3f(xvalue, yvalue, 0.0);
glEnd();
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1, 0, 1);
dots();
// glFlush();
glutSwapBuffers();
}
注意,glBegin
\ glEnd
序列界定了图元的顶点。我建议在指定顶点之前和之后立即在同一函数中调用此指令。
glClear
清除缓冲区,从而清除整个场景。如果要永久绘制点,则必须从 display
函数中删除 glClear
指令。
glClear(GL_COLOR_BUFFER_BIT);