动态模糊


云风曾做利用残像消除跳动感一文, 虽然文中屡次申明 附带程序和文字希望阐述的理论不是一回事, 无奈云风文笔不佳, 表述不清. 但仍旧有误人子弟的感觉, 今网友 Analyst 认为其毒害可比法轮功 ^_^ 吓的我一身冷汗. 正巧新近得到一本小册子《最新三维计算机图形学》([美] 安德鲁.格拉斯诺 著) 里面对其的描述通俗易懂, 特摘抄如下, 大家可以对比拙作 利用残像消除跳动感 阅读 ;-)


  动态模糊(motion blur)的问题是从传统的拍摄运动物体的影片中的模糊现象引发的。 一张张胶片从镜头前通过时曝光,然后离开镜头,再卷到胶片轴上去。但是,胶片曝光的时候, 如果前面的物体是在运动着的,则记录在胶片上的影象可能由于物体的运动而产生模糊。 如果胶片曝光时,物体的运动速度很慢,则胶片上的记录的模糊程度也非常轻微。 运动的速度越快,则胶片上记录的模糊程度就越严重。

  利用计算机生成的图象来模拟动态模糊是非常困难的,多数渲染画法都只能表现出 画图时那一瞬间的状态。也就是说将各种变化着的事物都“冻结”起来以后再画出来。 比如对于三维的图象,总是先将所有的对象物的位置都定下来以后再画出来。 至于对象物正向着什么方向运动着,以及运动的速度如何,都不表示出来。

  因为动态模糊是由于物体的运动所产生的,所以要想模拟出动态模糊的状态, 就得利用胶片曝光的时间来表现出动感。这样,计算机就需要更多的信息,程序会增大许多, 处理的时间也会增加很多。

  另外还有一个与动态模糊相似的问题,就是利用胶片来表现高速移动, 且移动速度还在发生变化的对象物。我们举一个透视效果较为明显的例子来分析这一问题: 假设在胶片的中央部分有一艘宇宙飞船正向着观察者的右肩处飞来。宇宙飞船越是靠近观察者, 看起来就越大,而且由于透视效果的影响,观察者会感到宇宙飞船越飞越快。 此时如果不做出动态模糊的效果,宇宙飞船看起来就像是跳跃着运动的。 而且这时还会出现另一种视觉现象:人的视觉器官在看着高速运动的物体时, 会自动预测物体的下一瞬间的位置。但是,由于不习惯,当我们面对着大量的变化着的透视图时, 常常会有预测的位置与宇宙飞船的实际位置不一致的现象。这时,我们不仅能看到运动着的宇宙飞船, 还会“看到”另一个宇宙飞船,这第二个“宇宙飞船”正是我们的眼睛所预测的宇宙飞船 应该在的位置。这种感官上的“两重影象现象”称为频闪现象(strobing)。 在各个画面中都做出动态模糊的效果,就会大大减轻频闪现象。

  模拟动态模糊现象对于动画制作来说是很重要的。为了能使计算机做出的图象更为逼真, 目前已研究开发出许多方法。在有的系统中,可以将动态模糊作为一般的手段来处理。 尽管如此,到目前为止,要真正做到准确地描述飞速运动的状态,就要在每一帧中加入大量的附加信息, 这仍然是一件很困难的事情。有些系统中根本就没有提供模拟动态模糊的手段。 将提供了动态模糊模拟手段和未提供这种手段的系统作一比较就可以看出, 能模拟动态模糊的系统的速度要慢的多。

  在制作三维动画时要模拟动态模糊现象,有时一些随手乱做的方法也可以起作用。 在动画的某一帧图象画完了以后,可以在其背景中放入对比度很低的前一帧图象。 也就是说在将前一帧图象全部消除之前,就将新的图象画上去。许多时候, 还可以将前面两帧甚至三帧的图象一个比一个低的对比度放进去,以此来进行简单的动态模糊的模拟。 利用这种方法当然不是总能得到很好的效果,有时甚至会得到相当糟糕的结果。 但这也比什么都不做好一些。(云风注:我在上一篇文章讲解中, 第一个 demo 使用了这个方法, 而且这应该是在当前的硬件条件下,纯软件运算时, 目前能找到的唯一适合实时处理的算法)

  还有一种方法只用于制作录象,就是半帧动画法(animating on fields)。 这种方法是在生成新的图象时,用两倍的速度将新的图象表示出来。利用这种方法可以 在一定程度上减轻由于没有进行动态模糊的模拟而产生的问题。前面已经讲过, 录象的图象一般是以跳跃扫描的方式来画出图象的。各帧先以奇数号扫描线画, 再以偶数号扫描线来画出图象。一般是利用全帧动画法 (animate on frames), 即在时间 t 画出一帧图象,然后在 t+ 1/30 秒画一帧新的图象(电影是 每秒 24 副画面)。而半帧动画法则是先在时间 t 用奇数号扫描线画出一幅图象, 然后在 t+ 1/60 秒的时刻用偶数号扫描线画下一幅图象。如此每隔 1/60 秒就画出 半帧图象,其速度是全帧动画法的两倍。这个方法的缺点是每次显示的都是半帧画面。 利用这个方法可以在一定程度上模拟动态模糊现象,但效果却不如直接模拟动态模糊的方法好。 (云风注:这个在风魂中有模拟,但效果很糟糕)

  动画中的动态模糊现象与失真现象有相似之处。失真现象的定义是: 对图象切得太粗所产生的一种不自然的视觉现象。(云风注: 关于利用反失真(anti-aliaing)请看利用残像消除跳动感一文 提供的第二个例子, 实现方法网友 Analyst 在他的主页的文章 再谈图像的平滑显示 中已经解说了, 另外我也在流言版上谈过. 就是使用 alpha 混合来作滤波处理, 至于闪烁是由于 16bit 色下作 alpha 混合的精度不够加上风魂简化处理 alpha 混合的误差导致的, btw, 这种方法不适合做实时处理) 而动态模糊现象则是由于动画中每一帧画面所占的时间太长引起的。 如果能在一秒里表现 100 帧图象,则图象的变换速度就非常快,也就不存在动态 模糊的问题了。由此,我们可以说动态模糊现象完全是由于一定的时间内所给出的图象数量 不足而引起的。因此可以将这种现象称之为由于时间的失真现象(temporal aliasing)。 在强调是采用数学的方法来研究动态模糊现象时,常常用这个术语。


很遗憾的是,网友 Analyst 理解我的思路, 却没有仔细阅读我的文字, 应该是我的文章都是仓促完成,表述含糊不清。关于动态模糊的模拟,我想重贴上上次提出的方法: " 我们要求游戏有 20fps, 在每帧图里再由物体1/20 秒内每 1/200 秒的状态, 共 10 帧的组合, 那么, 计算机需要每秒产生200 帧图", 就是说如果计算机能够达到 十倍于显示速度的画面产生速度, 用 10 帧图组合成一张图显示, 就可以模拟出动态模糊的效果, 如果物体运动的速度更快, 我们就需要计算机以更快的速度 产生物体的运动过程的图象。 当然在目前的硬件水平下,这是办不到的。