5

我正在考虑将运动模糊添加到我的 2D 程序中,但我怀疑我当前算法的结果。

我的方法目前看起来像这样:

  • 绘制到后备缓冲区。
  • 当需要更新前缓冲区时,将后缓冲区混合到前缓冲区。
  • 重复

导致“运动模糊”效果的原因显然是混合,因为运动中的物体会留下褪色的痕迹。

这显然对硬件要求不是很高,无论如何都会完成双缓冲,唯一额外的步骤是 alpha 混合,这是一个简单的计算。但是,轨迹会非常锐利,而且一点也不模糊,这可能看起来有点奇怪。我可以在混合步骤之前在后台缓冲区上做一个盒子模糊,但感觉这对像 Nintendo DS 这样的低端系统来说可能非常费力。

是否有任何解决方案可以让我更有效地完成工作或产生更好看的结果?

4

3 回答 3

5

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

您目前使用的方法模拟了持久性,就好像您在使用慢速荧光粉的旧 CRT 上进行渲染一样。这与运动模糊并不是一回事。如果您的帧持续时间为 20 毫秒 (1000/50),则运动模糊帧由跨越 20 毫秒帧持续时间的渲染组成,所有这些都具有相同的 alpha 权重。持久性解决方案由 20、40、60、80、100 毫秒前的渲染组成,逐渐淡出。

于 2009-07-03T14:45:49.950 回答
1

它可能根本不是很锋利。这完全取决于使用的混合功能。例如,先前/当前图像的 0.1/0.9 分别会提供一些微弱的痕迹。

我可能会补充一点,这本质上是 OpenGL 中的运动模糊是如何完成的(通过累积缓冲区)

于 2009-07-03T13:32:40.280 回答
1

据我所知,没有真正的方法可以更有效地做到这一点。那是尽可能高效。如果帧速率很好并且运动也不是太锐利,它看起来还不错。

最好的计划是为每个像素画一条从新位置到旧位置的半透明线。然而,这不是一个简单的计算。

于 2009-07-03T13:32:41.340 回答