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);