代码之家  ›  专栏  ›  技术社区  ›  Skurmedel

二维运动模糊解决方案

  •  5
  • Skurmedel  · 技术社区  · 15 年前

    我正在考虑将运动模糊卡入我的二维程序,但我怀疑我当前算法的结果。

    目前我的方法如下:

    • 拉到后缓冲区。
    • 时间到 更新前缓冲区,混合 将缓冲垫放在前缓冲器上。
    • 重复

    造成“运动模糊”效果的原因显然是混合,因为运动中的对象会留下一条褪色的痕迹。

    显然,这对硬件要求不高,无论如何都要进行双缓冲,唯一的额外步骤是alpha混合,这是一个简单的计算。不过,这条小路会很锋利,一点也不模糊,看起来有点奇怪。在混合步骤之前,我可以在缓冲区后面做一个模糊处理,但在任天堂DS这样的低端系统上,这会让人感觉很累。

    有没有什么解决方案可以让我更有效地完成任务,或者产生更好的效果?

    3 回复  |  直到 15 年前
        1
  •  5
  •   Andrew Bainbridge    15 年前

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

    你现在使用的方法模拟了持久性,就好像你在用慢荧光粉渲染一个旧的CRT。这和运动模糊不一样。如果您的帧持续时间是20毫秒(1000/50),那么运动模糊帧由跨越20毫秒帧持续时间的渲染组成,所有渲染都具有相同的alpha权重。持久性解决方案包括20、40、60、80、100毫秒前的渲染,逐渐淡出。

        2
  •  1
  •   Goz    15 年前

    据我所知,没有真正的方法能更有效地做到这一点。这是最有效的方法。如果帧速率很好,移动也不太快,这看起来相当不错。

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

        3
  •  1
  •   EFraim    15 年前

    它可能一点也不锋利。这完全取决于所使用的混合函数。例如,0.1/0.9对于前一幅/当前的图像,将分别提供一些模糊的痕迹。

    我可以补充一下,这就是OpenGL中运动模糊的基本原理(通过累积缓冲区)。