2D动态模糊解决方案

6

我在考虑将运动模糊应用于我的二维程序中,但我对当前算法的结果存有疑虑。

目前我的方法如下所示:

  • 绘制到后台缓冲区。
  • 当更新前台缓冲区时,将后台缓冲区混合到前台缓冲区。
  • 重复以上步骤。

显然导致"运动模糊"效果的是混合过程,因为运动的物体会留下褪色的轨迹。

这显然对硬件要求不高,双缓冲区处理本来就要做,唯一额外的步骤就是 alpha 混合,这是一个简单的计算。然而,这些轨迹将非常锐利,完全不模糊,可能看起来有点奇怪。我可以在混合步骤之前对后台缓冲区进行盒式模糊,但感觉在类似Nintendo DS这样的低端系统上可能会很吃力。

是否有任何更有效率或产生更好外观结果的解决方案?

3个回答

5

实际上,您应该渲染许多中间帧并将它们混合成一个结果。例如,如果您的输出帧速率为50 fps,则在向用户显示之前,将10个帧组合在一起混合可能会得到合理的结果,内部渲染速度应为500 fps。

您目前使用的方法模拟了持续性,就好像您正在渲染到具有缓慢荧光物质的旧CRT上。这与运动模糊并不完全相同。如果您的帧持续时间为20ms(1000/50),则运动模糊帧由跨越20ms帧持续时间的渲染组成,所有渲染都具有相同的alpha权重。持续性解决方案包括从20、40、60、80、100毫秒前的渲染,逐渐消失。


这是一个好建议,但听起来可能需要大量的处理能力。 - Skurmedel
1
确实。根据您正在渲染的原语的类型,可能有一些优化可以应用。或者您可以尝试我的建议和您的混合。您提出的算法是90年代的标准演示编码技巧。它可以产生不错的结果。然而,如果您正在寻找一个通用的、简单的、快速的运动模糊实现,那么您就没有那么幸运了。这就是为什么你很少看到它被实现的原因。 - Andrew Bainbridge

1

这可能并不是非常清晰。这完全取决于所使用的混合函数。例如,对于先前/当前图像分别为0.1 / 0.9将提供一些微弱的轨迹。

我可以补充说,这基本上就是OpenGL中运动模糊的实现方式(通过累积缓冲区)。


感谢您的反馈。很高兴知道我的想法并不太业余 :) - Skurmedel

1

据我所知,没有更有效的方法来完成它。这是效率最高的方式。如果帧速率良好且运动不太尖锐,则看起来非常好。

最好的方案是对于每个像素,从新位置到旧位置绘制半透明线条。然而,这不是一个简单的计算。


我应该补充说明的是,即使这个看起来更好的计划,在帧之间物体没有线性移动的情况下也会出现错误。 - Goz
谢谢。这是个有趣的想法,Goz。我没有考虑过这个问题。如果后备缓冲区的不透明度很低,则在单个帧中对象从屏幕的一端到另一端移动可能会看起来很奇怪。 - Skurmedel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接