2

我在 linux 机器上用 C 语言自学 openGL。这是我使用循环绘制圆的基本代码。我想放慢这个程序的执行速度,以便我可以逐点看到圆的形成。(希望我能够正确传达我的意思)。

#include <GL/glut.h>    // Header File For The GLUT Library
#include<math.h>

void main (int argc, char*argv[])
{
    float y, x=-0.75;

    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowPosition(200,150);
    glutInitWindowSize(500,500);
    glutCreateWindow (argv[0]);

    glClearColor (0.0, 0.0, 0.0, 0.0);  // choosing the background color
    glClear (GL_COLOR_BUFFER_BIT);      // setting the color buffer to background color
    glColor3f(1,1,1);
    glPointSize(2);

    for (x=-0.75;x <= 0.75; x=x+0.005){
        y = sqrt(0.5625 -(x*x));

        glBegin(GL_POINTS);
            glVertex2f(x,y);
            glVertex2f(x,-y);
        glEnd();

    }



    glFlush();

    glutMainLoop();

}
4

2 回答 2

4

当窗口尚未放置在屏幕上时,执行绘图命令的循环可能会一次运行。作为一般规则,您应该始终从绘图处理程序绘制,而不是从其他地方绘制。

关于您要求“放慢”进程的请求。你可以使用usleep。但是,这也会使您的程序在执行绘图需要很长时间时无响应。

另外,重要的是OpenGL使用了异步操作模型,即所有的绘图操作都排队等待,只有在队列清空后才执行。因此,要以明确的时间查看绘图进度,您必须等待上一步完成。为此使用glFinish

最后但并非最不重要的一点是,要实际看到正在发生的进度,您必须绘制到(双缓冲窗口的)前缓冲区或使用单个缓冲窗口。现在有一个问题:如果您使用的是合成窗口管理器,则窗口的内容更新可能会延迟到执行缓冲区交换为止。当然,这不会发生在单个缓冲窗口上。这实际上意味着,合成和单缓冲绘图不能很好地混合。

实现这一点的唯一真正强大的方法不是延迟绘图本身,而是在通常的动画循环中一次又一次地重绘整个场景。这样做会在每次迭代后一步终止绘图过程。

于 2013-10-14T00:59:06.053 回答
2

圆不会一次画一个点;所有命令将一起用于创建圆圈,然后通过缓冲区翻转立即显示。这就是 OpenGL 的工作原理。

我很想谈论这段代码的各种问题,但我只想提一下,最好使用单个 glBegin/glEnd 对来包含您的所有观点。

于 2013-10-14T00:01:38.380 回答