如何在openGL中制作步进显示动画??
我正在做一个 reprap 打印机项目来读取 GCode 文件并将其解释为图形。 现在我很难制作绘制整个对象的逐步动画。 我需要画很多短线来组成一个完整的物体。 例如:
|-----|
| |
| |
|-----|
正方形由许多短线组成,每条线由如下代码生成:
glPushMatrix();
.....
for(int i=0; i< instruction[i].size(),i++)
{ ....
glBegin(GL_LINES);
glVertex3f(oldx, oldy, oldz);
glVertex3f(x, y, z);
glEnd();
}
glPopMatrix();
现在我想制作一个步进动画来展示这个正方形是如何制作的。每次绘制新线时我都试图刷新屏幕,但它不起作用,整个正方形一次就出来了。有人知道怎么做吗?
最佳答案
典型的 OpenGL 实现会将大量调用排队,以将它们一起批处理成突发事件,以最佳利用可用的通信带宽和 GPU 时间资源。
您想要做的基本上是双缓冲渲染的对立面,即在每个绘图步骤立即可见的地方进行渲染。一种方法是渲染到单个缓冲窗口并在每个步骤后调用 glFinish()
。主要缺点:它可能无法在使用合成窗口管理器和类似工具的现代系统上正常工作。
我推荐的另一种方法是使用单独的缓冲区进行增量绘制,并不断从这个缓冲区刷新主帧缓冲区。关键主题是帧缓冲区对象和渲染到纹理。
首先,您创建一个 FBO(那里有大量教程和 StackOverflow 上的答案)。 FBO 基本上是一种抽象,您可以将目标缓冲区(如纹理或渲染缓冲区)连接到它,并且可以将其绑定(bind)为绘图调用的目的地。
那么如何解决你的问题呢?首先,您不应该通过延迟绘图循环来制作动画。这有几个原因,但主要问题是,您因此失去了程序交互性。相反,你维护一个(全局)计数器你在你的动画中的哪一步。我们称它为步骤
:
int step = 0;
然后在您的绘图功能中,您必须分阶段:1) 纹理更新 2) 屏幕刷新
第一阶段包括将您的帧缓冲区对象绑定(bind)为渲染目标。为此,目标纹理必须未绑定(bind)
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebuffer(GL_FRAMEBUFFER, animFBO);
glViewport(0, 0, fbo.width, fbo.height);
set_animFBO_projection();
现在的诀窍是,你只清除一次 animFBO,即在创建之后,然后再也不会。现在你根据动画步骤画线
draw_lines_for_step(step);
并增加计步器(可以作为复合语句执行此操作,但这更明确)
step++;
更新动画 FBO 后,就该更新屏幕了。先解绑animFBO
glBindFramebuffer(GL_FRAMEBUFFER, 0);
我们现在在主要的屏幕帧缓冲区上
glViewport(0, 0, window.width, window.height);
set_window_projection(); //most likely a glMatrixMode(GL_PROJECTION); glOrtho(0, 1, 0, 1, -1, 1);
现在绑定(bind) FBO 附加纹理并将其绘制到一个完整的视口(viewport)四边形
glBindTexture(GL_TEXTURE_2D, animFBOTexture);
draw_full_viewport_textured_quad();
最后进行缓冲区交换以显示动画步骤迭代
SwapBuffers();
关于c++ - 如何在openGL中制作一步一步的显示动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13002267/