1

该程序能够创建一个窗口并在我的鼠标在窗口上时定位它,但是显示功能似乎确实有效。我在这里想念什么?

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

4

1 回答 1

2

您正在使用双缓冲窗口(请参阅 参考资料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清除缓冲区,从而清除整个场景。如果要永久绘制点,则必须从函数中删除glClear指令。display

glClear(GL_COLOR_BUFFER_BIT);

于 2021-09-26T20:20:43.107 回答