运动模糊是景物图象中的移动效果。它比较明显地出现在长时间曝光或场景内的物体快速移动的情形里。
为什么会出现运动模糊
摄影机的工作原理是在很短的时间里把场景在胶片上曝光。场景中的光线投射在胶片上,引起化学反应,最终产生图片。这就是曝光。如果在曝光的过程中,场景发生变化,则就会产生模糊的画面。
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也是一种浪费。
在一个游戏中,如果你想大量采用运动模糊的话,你必须做好牺牲图象质量的准备。但同时,你可以只增加很少的运动模糊,就是只对运动极快的物体采用运动模糊。比如,爆炸时的火花,你可以使用线段而不是点来使用模糊效果。在瀑布以及武器开火的情况中,也可以这样处理。我玩赛车游戏时,我经常因为车轮没有运动模糊效果而失望。因为车轮旋转得很快,你不可能看清任何细节。一个解决办法是:储存几幅车轮的纹理贴图,每幅都包含不同的运动模糊效果。随着车速的加快,显示模糊越来越明显的纹理贴图。对于路面贴图也使用同样的方法。这就会增加游戏的真实感。
如果你想做一段不是实时合成的动画,那么因为动态模糊增加些麻烦还是值得的,特别是在运动非常快的时候。当然,这并非任何时候都可取。比如,如果你想能够在暂停动画时看到清晰的图像,这时候你可能就想减少或是忽略掉动态模糊了。
参考
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一样被支持,但我的确希望它能得到它应该得到的认可。从现在开始,我将用这种格式创建我所有的动画。