繁体   English   中英

使用GLUT_DOUBLE模式绘制形状

[英]Draw shape with GLUT_DOUBLE mode

我有一个代码:

#include <gl/glut.h>
#include <stdio.h>

#define WinW 1000
#define WinH 500
/* ----------------------------------------------------------------------- */

bool mousedown = false;

void myInit(void)  {
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glColor3f(1.0, 0.0, 0.0);
    glPointSize(5.0);
    glShadeModel(GL_SMOOTH);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, WinW, WinH, 0.0, -1.0, 1.0);
}

void myDisplay(void)  {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBegin(GL_POINTS);
    glColor3f(1.0, 0.0, 0.0);
    glVertex2i(50, 50);
    glEnd();

    //glFlush();
    glutSwapBuffers();
}
void myMouse(int button, int state, int x, int y){
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
        mousedown = true;
    }
    else
        mousedown = false;
}
void myMovedMouse(int mouseX, int mouseY){
    if (mousedown){
        //printf("%d %d\n", mouseX, mouseY);
        glBegin(GL_POINTS);
        glColor3f(0.0, 1.0, 0.0);
        glVertex2i(mouseX, mouseY);
        glEnd();

        //glFlush();
        glutSwapBuffers();
    }
}

/* ----------------------------------------------------------------------- */

int main(int argc, char *argv[])  {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(WinW, WinH);
    glutInitWindowPosition(100, 150);
    glutCreateWindow("Computer Graphic");

    myInit();
    glutDisplayFunc(myDisplay);
    glutMouseFunc(myMouse);
    glutMotionFunc(myMovedMouse);

    glutMainLoop();
}

我想通过鼠标拖动来绘制自由形状。
我尝试使用glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)glFlush() ,它对我glFlush()
但是当我在myMovedMouse()使用GLUT_DOUBLEglutSwapBuffers()时,屏幕闪烁(黑白色黑白色...)
我是OpenGL的新手,任何人都有解决方案。
感谢帮助!

使用双缓冲时,必须在每次重绘时绘制所有点。 因此,您必须维护所有要点的列表。 步骤如下:

  1. 启动时,创建一个空的点列表。 如果您想要漂亮的代码,请定义一个包含x和y位置两个值的类/结构,并使用诸如std::vector类的C ++容器作为点列表。

  2. 从鼠标输入中获取新点时,将该点添加到点列表中,然后调用glutPostRedisplay()

  3. myDisplay()函数中,绘制列表中的所有点。

与使用单个缓冲相比,必须维护点列表似乎增加了复杂性。 但是,只要您走得更远,您可能仍然需要它。 例如,如果用户调整窗口大小,则无论如何都必须能够重绘所有点。 因此,在单缓冲模式下一一绘制点不会使您走得太远。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM