如何在openGL中逐步显示动画?

时间:2012-10-21 21:13:59

标签: c++ opengl animation

如何在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();

现在我想制作一个步骤动画来显示这个方块的制作方式。每次绘制一条新线时我都试图刷新屏幕,但是它不起作用,整个方块立刻就出来了。有谁知道怎么做?

3 个答案:

答案 0 :(得分:0)

每次绘制调用后都应该调用SwapBuffer方法。 确保你没有拧紧矩阵堆栈,你可能需要一些东西像断点一样“暂停”渲染。

答案 1 :(得分:0)

典型的OpenGL实现会将大量调用排队,将它们一起批量处理,以充分利用可用的通信带宽和GPU时间资源。

您想要做的基本上与双缓冲渲染相反,即渲染每个绘制步骤立即可见的位置。一种方法是通过渲染到单个缓冲窗口并在每个步骤后调用glFinish()。主要缺点:在使用合成窗口管理器等的现代系统上可能效果不佳。

我推荐的另一种方法是使用单独的缓冲区进行增量绘制,并不断刷新主帧缓冲区。关键主题是帧缓冲对象渲染到纹理

首先,您创建一个FBO(大量的教程和StackOverflow上的答案)。 FBO基本上是一个抽象,你可以连接目标缓冲区,比如纹理或渲染缓冲区,它可以被绑定为绘制调用的目的地。

那么如何解决你的问题呢?首先,你不应该通过延迟绘图循环来完成动画。这有几个原因,但主要问题是,您通过此方式松开了程序交互性。相反,你维护一个(全局)计数器,你的动画中是哪一步。我们称之为step

int step = 0;

然后在你的绘图功能中你必须分阶段:1)纹理更新2)屏幕刷新

第一阶段包括将framebuffer对象绑定为渲染目标。为此,目标纹理必须是未绑定的

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);

现在绑定FBO附加纹理并将其绘制为完整视口四元组

glBindTexture(GL_TEXTURE_2D, animFBOTexture);
draw_full_viewport_textured_quad();

最后执行缓冲区交换以显示动画步骤迭代

SwapBuffers();

答案 2 :(得分:0)

如果您只希望线条一个接一个地出现,而您不必挑选效率或良好的编程风格,请尝试以下方法:

(在您的绘图程序中)

  

if (timer > 100)   {

     

//draw the next line

     

timer = 0;

     

}

     

else

     

timer++;

     

//draw all the other lines (you have to remember wich one already appeared)

     

//for example using a boolean array "lineDrawn[10]"

计时器是一个整数,告诉您绘制场景的频率。如果你把它做得更大,那么当你运行你的程序时,屏幕上的内容会更慢。

当然,只有你有一个平局例程才有效。如果没有,我强烈建议使用一个。

- &gt;各处都有很多教程,例如:

http://nehe.gamedev.net/tutorial/creating_an_opengl_window_%28win32%29/13001/

Goor祝你好运!

PS:我认为你做的几乎一样,但没有计时器。这就是为什么所有东西都绘得如此之快以至于你认为它同时出现了。