如何在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();
现在我想制作一个步骤动画来显示这个方块的制作方式。每次绘制一条新线时我都试图刷新屏幕,但是它不起作用,整个方块立刻就出来了。有谁知道怎么做?
答案 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:我认为你做的几乎一样,但没有计时器。这就是为什么所有东西都绘得如此之快以至于你认为它同时出现了。