Language agnostic 二维运动模糊解决方案

Language agnostic 二维运动模糊解决方案,language-agnostic,graphics,2d,effects,motion-blur,Language Agnostic,Graphics,2d,Effects,Motion Blur,我正在考虑在我的2D程序中加入运动模糊,但我怀疑我当前算法的结果 目前我的方法是这样的: 拉到后缓冲区 什么时候去 更新前缓冲区,混合 向后缓冲到前缓冲器上 重复 造成“运动模糊”效果的原因显然是混合,因为运动中的对象会留下一条淡入淡出的轨迹 这显然对硬件要求不高,无论如何都会进行双缓冲,唯一额外的步骤是alpha混合,这是一个简单的计算。然而,这些痕迹将非常尖锐,而且一点也不模糊,这可能看起来有点奇怪。在混合步骤之前,我可以在后缓冲区上进行框模糊,但对于任天堂DS这样的低端系统来说,这可能

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

目前我的方法是这样的:

  • 拉到后缓冲区
  • 什么时候去 更新前缓冲区,混合 向后缓冲到前缓冲器上
  • 重复
造成“运动模糊”效果的原因显然是混合,因为运动中的对象会留下一条淡入淡出的轨迹

这显然对硬件要求不高,无论如何都会进行双缓冲,唯一额外的步骤是alpha混合,这是一个简单的计算。然而,这些痕迹将非常尖锐,而且一点也不模糊,这可能看起来有点奇怪。在混合步骤之前,我可以在后缓冲区上进行框模糊,但对于任天堂DS这样的低端系统来说,这可能会非常费力


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

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


我可以补充一点,OpenGL中的运动模糊本质上就是这样做的(通过累积缓冲区)

据我所知,没有真正的方法可以更有效地进行。这是最有效的。如果帧速率好,运动也不太剧烈,看起来就不错了


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

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


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

我应该补充一点,如果对象在帧之间没有线性移动,即使这个看起来更好的平面也会出错。谢谢。这是一个有趣的想法,戈兹,没有考虑过。如果backbuffer的不透明度很低,那么如果一个对象在一个帧内从一端到屏幕另一端,它可能看起来很奇怪。谢谢您的输入。很高兴知道我的想法不是太业余:)这是一个很好的建议,但听起来可能需要很大的处理能力。根据渲染的基本体的类型,可能会应用一些优化。或者你可以尝试一下我的建议和你的建议的混合。你提出的算法是90年代的标准演示编码技巧。它可以产生很好的效果。然而,如果您正在寻找一种通用的、简单的、快速的运动模糊实现,那么您的运气就不好了。这就是为什么你很少看到它被实现的原因。