2D 运动模糊解决方案
-
21-08-2019 - |
题
我正在考虑将运动模糊加入到我的 2D 程序中,但我怀疑当前算法的结果。
我的方法目前看起来像这样:
- 绘制到后台缓冲区。
- 当需要更新前缓冲区时,将后式缓冲液混合到前缓冲区上。
- 重复
造成“运动模糊”效果的显然是混合,因为运动中的物体会留下淡出的痕迹。
这显然对硬件要求不是很高,双缓冲无论如何都会完成,唯一的额外步骤是 alpha 混合,这是一个简单的计算。然而,轨迹会非常清晰,一点也不模糊,这可能看起来有点奇怪。我可以在混合步骤之前在后台缓冲区上进行框模糊,但感觉这对于像任天堂 DS 这样的低端系统来说可能会非常繁重。
是否有任何解决方案可以让我更有效地完成工作或产生更好看的结果?
解决方案
实际上,您应该渲染许多中间帧并将它们混合成一个结果。例如,假设您的输出帧速率为 50 fps。如果您以 500 fps 进行内部渲染,并将十帧组混合在一起,然后再向用户显示,您可能会得到合理的结果。
您目前使用的方法模拟持久性,就好像您正在使用慢速荧光粉在旧 CRT 上进行渲染一样。这实际上与运动模糊不同。如果帧持续时间为 20 毫秒 (1000/50),则运动模糊帧由跨越 20 毫秒帧持续时间的渲染组成,所有渲染都具有相同的 Alpha 权重。持久化解决方案由20、40、60、80、100毫秒前的渲染组成,逐渐淡出。
其他提示
据我所知,没有真正的方法可以更有效地做到这一点。这就是它的效率。如果帧速率良好并且运动也不太尖锐的话,它看起来相当不错。
最好看的计划是,对于每个像素,从新位置到旧位置绘制一条半透明线。然而,这并不是一个简单的计算。
它可能根本不是很锐利。这完全取决于所使用的混合函数。例如,前一个/当前图像分别为 0.1/0.9 将提供一些微弱的痕迹。
我可能会补充一点,这本质上就是 OpenGL 中运动模糊的完成方式(通过累积缓冲区)