gpt4 book ai didi

c++ - 使用 GLUT_DOUBLE 模式绘制形状

转载 作者:行者123 更新时间:2023-11-28 06:41:02 25 4
gpt4 key购买 nike

我有一个代码:

#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(),它对我有用。
但是当我在 myMovedMouse() 中使用 GLUT_DOUBLEglutSwapBuffers() 时,屏幕在闪烁(黑-白-黑-白... )
我是 OpenGL 的新手,任何人都有解决方案。
感谢您的帮助!

最佳答案

使用双缓冲时,您必须在每次重绘时绘制所有点。所以你必须维护所有点的列表。接下来的步骤是:

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

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

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

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

关于c++ - 使用 GLUT_DOUBLE 模式绘制形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25947620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com