当前位置: 代码迷 >> 综合 >> 什么是运动模糊(Motion Blur)
  详细解决方案

什么是运动模糊(Motion Blur)

热度:13   发布时间:2023-12-12 09:36:04.0
from:http://www.cnblogs.com/lancidie/archive/2011/02/24/1963474.html
什么是运动模糊(Motion Blur)

 运动模糊是景物图象中的移动效果。它比较明显地出现在长时间暴光或场景内的物体快速移动的情形里。

为什么会出现运动模糊

  摄影机的工作原理是在很短的时间里把场景在胶片上暴光。场景中的光线投射在胶片上,引起化学反应,最终产生图片。这就是暴光。如果在暴光的过程中,场景发生变化,则就会产生模糊的画面。

 

Why should you bother?

  不难发现,在电影或电视中,运动模糊是经常出现的,甚至于你不会注意到它。另一方面,在计算机图形中,你就会发现缺少运动模糊,由此也带来了失真。

  举个例子,lensflare是近来较为流行的一种图象效果,但传统的图象制作者常常简化此效果,自从我们认识到它是仿真的一种工具之后,计算机便开始模拟此效果。在电影制作中,也有如此为了反应现实,而采用的手段。

  看一下没有采用运动模糊的计算机动画,你会发现物体快速移动时,缺乏连贯性和真实感。你在电视的体育报道中,也能看到类似的效果。因为普通电视节目使用25帧/秒的摄象机,而体育节目则使用1000帧/秒的摄象机,从而提供清晰的慢镜头回放。但实际中,只回放小部分的帧,失去了运动模糊,使移动的物体看起来有跳跃感。

  我们对电视或电影中的运动模糊都习以为常,所以在运动图象中看不到它就会觉得不真实。所以,缺乏运动模糊是计算机动画不真实的原因之一,因为计算机产生的图象“棱角分明”,很注目,以致削弱了运动效果。

  另外,有运动模糊的图象包含了更多的信息。请比较这两幅图:

  这两幅图中的场景是完全一样的,但其中一幅是从向前飞速移动的摄象机中得到,另一幅则是摄象机向左移动。这从图片上可以轻易地分辨出来。观看动画时,大脑会注意到那些更多的信息,由此也使运动变得更平滑,场景更逼真。

更多的细节

  们来观察一下电影摄象机如何拍摄移动的场景。

  一架电影摄象机包括以下部分:

  • 镜头
      把光聚焦到胶片上
  • 快门
      快门控制在一定时间内,打开让光进入。
  • 胶片
      胶片包括感光的化学品。通过这些感光的材料记录场景,生成影象。

  左边的图片显示的是一个静止不动的红色球体被摄象机摄象时的情形。这里只画出了摄象机中三个重要部分:镜头,快门和胶片。

  可以看出,快门在打开状态,让胶片暴光。而胶片上已有两帧已经过暴光,一帧正在暴光。区别在于后者稍微暗一些,因为暴光的时间还不够。稍后,快门将关闭,这时的三帧将完全一样。

  快门关闭之后,胶片将向下移动一个合适的距离,让下一帧胶片到达暴光位置,然后快门又将再次打开暴光,这样的过程在一秒内会重复许多次。

  右边图片的情形与上面相似,但现在,球体会向箭头所指的方向快速移动。

  快门照常打开,胶片也一样被暴光。但现在,由于暴光的时间内,球体正在移动,导致了胶片上的图片变模糊了。这就是我们说的运动模糊效果。

  现在,我可以打赌,如果你看到这写模糊了的画面中任意一幅的话,你一定能说出摄象时,球正在水平方向上移动。因为有运动模糊的图象相比之下包含更多的信息。

在图象中创建运动模糊的效果

1、空间反失真

  你可能对一种叫做“过采样”的反失真技术比较熟悉。这种技术先渲染一幅大得多得图象,然后缩小此图象。我将先介绍这种反失真技术的实现,因为运动模糊的实现与此很相似。

  举个例子,渲染一幅50x50红色圆圈的反失真图象:


1、染更多的象素
  在更高的分辨率下画一个“失真”的圆。这里,我使用200x200的分辨率,即比目标图大4倍。


2、分图象
  然后,想象着把此图象分成许多正方形。因为此图象比目标图象大4倍,我们让每个小正方形为4x4。


3、平均值
  接着,对于每个小正方形,取其中所有象素的平均值。用此平均值填充小正方形。

4、缩小  最后,把图片缩小为50x50。这就是一个反失真的红圆图片。

2、时间反失真(运动模糊)

  对于运动模糊,完成的方法很相似。上面说的方法称为“空间反失真”(就是平滑空间)。创建动画的方法叫做时间反失真(就是平滑时间)。 这种方法与创建反失真图象的方法相似。

1、染更多的帧
  就象空间反失真中,你渲染更多的象素一样,一开始,你需要渲染更多的帧。举例说,对于显示4秒(即100帧)的动画,你要渲染400帧。这400帧也覆盖4秒的时间,只是划分得更细。

  在这里,左边的每一帧都显示1/100秒。

2、分所有帧
  接下来,按每4帧为一组 . . .

3、平均 . . .
  把组内所有4帧进行积累渲染。

4、完成
  现在你就得到了一个25帧/秒的动画。右边的每一帧有运动模糊效果的图片将在1/25秒中显示。

对程序员来说有意味着什么

  现在,你是否想试着在你的程序里加入运动模糊?但是,这决定于你的程序是那类程序。

  运动模糊在实时程序中很难实现。它要求把帧速提高几倍。对于实时程序,唯一的可能是降低分辨率。但这对大多数程序员来说,这是不能接受的。

  一些游戏尝试通过把当前帧于前一帧一起渲染来模拟运动模糊,结果是前一帧在屏幕上变成一些污点。这不是真正的运动模糊;效果不好并且对CPU也是一种浪费。

  在一个游戏中,如果你想大量采用运动模糊的话,你必须做好牺牲图象质量的准备。但同时,你可以只增加很少的运动模糊,就是只对运动极快的物体采用运动模糊。比如,爆炸时的火花,你可以使用线段而不是点来使用模糊效果。在瀑布以及武器开火的情况中,也可以这样处理。我玩赛车游戏时,我经常因为车轮没有运动模糊效果而失望。因为车轮旋转得很快,你不可能看清任何细节。一个解决办法是:储存几幅车轮的纹理贴图,每幅都包含不同的运动模糊效果。随着车速的加快,显示模糊越来越明显的纹理贴图。对于路面贴图也使用同样的方法。这就会增加游戏的真实感。

  如果你想做一段不是实时合成的动画,那么因为动态模糊增加些麻烦还是值得的,特别是在运动非常快的时候。当然,这并非任何时候都可取。比如,如果你想能够在暂停动画时看到清晰的图像,这时候你可能就想减少或是忽略掉动态模糊了。

实时的运动模糊效果DEMO
[
motion.zip 下载]

  这里有一个实时的demo,显示一个立方体在屏幕上飞行。可以使用以下键:

S:
慢速运动
M:
切换正确/错误的效果
3:
切换红/蓝 3D模式
↑/↓:
进度
→/←:
调整背景亮度
ESC:
退出

运动模糊动画DEMO
[
fly2.zip(1.3Mb) 下载]

  这个动画的帧用Terragen渲染。通过Bitty加入空间和时间反失真,最后用Bink作成动画。需要binkplayer来播放(可从主页上免费下载)。

 

参考:

Bitty
http://parnham.future.easyspace.com/
  Bitty是一个小程序,可以进行空间和时间反失真(运动模糊)。输入渲染好的帧,就可以得到运动模糊的效果。它也能把图象重新采样。它不能输出动画文件,只能输出帧画面文件用于生成.MPG、.AVI或.BIK(bink!) 视频文件。

Terragen Motion Blurred Animations
http://parnham.future.easyspace.com/animations.htm
  Dan通过使用Terragen渲染帧,Bitty混合帧已经创建了许多极棒的动画。

Bink!
http://www.smacker.com/ (译者注:《星际争霸》用的就是它的前身)
  Bink是一种新颖出色的视频压缩解压格式。easily outperforming MPEG-IIand AVI. 它是一个很新的系统,并不象.MPG 或.AVI一样被支持,但我的确希望它能得到它应该得到的认可。从现在开始,我将用这种格式创建我所有的动画。

  相关解决方案