我在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();
}
答案 0 :(得分:4)
您的循环,执行绘图命令可能一次运行,此时窗口尚未放置在屏幕上。作为一般规则,您应该始终从绘图处理程序和其他任何地方绘制。
关于“减慢”流程的请求。您可以使用usleep。但是,这也会使您的程序无法响应执行的绘图时间。
此外,重要 OpenGL使用异步操作模型,即所有绘图操作都排队并仅在刷新队列后执行。因此,要以明确定义的时间查看绘图进度,您必须等待上一步完成。请使用glFinish
。
最后但并非最不重要的是,要实际看到正在发生的进展,您必须绘制到前缓冲区(双缓冲窗口)或使用单个缓冲窗口。现在有一个问题:如果您正在使用合成窗口管理器,窗口的内容更新可能会延迟,直到执行缓冲区交换。当然,这不会发生在单个缓冲窗口上。这实际上意味着,组合和单个缓冲绘图不能很好地混合。
实现这一目标的唯一非常有效的方法不是延迟绘图本身,而是在通常的动画循环中重新绘制整个场景。这样做可以在每次迭代后一步终止绘图过程。
答案 1 :(得分:2)
圆圈不会一次绘制一个点;所有命令将一起用于创建圆圈,然后通过缓冲区翻转立即显示。这就是OpenGL的工作原理。
我很想谈论这段代码的各种问题,但我只想提一下,使用单个glBegin / glEnd对来封闭所有点数会更好。