众所周知,在三维软件中渲染运动模糊效果是极其耗费渲染时间的事情,但是运动模糊这种视觉效果在有较快运动物体的三维短片中却起着相当重要的角色。那么如何又快又好地实现运动模糊对于制作三维短片的工作者来说则是一个重要的课题。
这一次分享的制作经验,使用三维软件为Maya,使用渲染器有VRay和Mental ray;使用的后期软件有AE和Nuke,基本涉及了大家平时习惯使用的主流软件,满足不同人群的需要。
本文以及录制的视频结构,会分为理论部分和操作部分两大块。对于不熟悉这些概念的朋友来说,可以先从理论开始看起,了解一下运动模糊的来龙去脉,以及我们在做动画的时候,运动模糊是非常有必要的。因为考虑到要照顾不了解的朋友,所以理论部分依然是讲解得极为细致、深入浅出。
对于已经比较熟悉了的朋友,可以直接查阅自己使用的渲染器和软件对应的后期操作部分。
理论部分:
我们先来做个小试验:抬起你的手,在你的面前快速摇晃,那么现在你看到的是什么?是你的手,是的,但不是平时看到的那种,而是带着拖尾的,有虚影的手。你所看到的这种现象,就是运动模糊。
不论是通过肉眼观察,还是通过相机拍摄,我们总是能够观察到这样一种运动模糊的现象。可以说,它是普遍存在的一种视觉现象。
产生的原因也很简单:当光进入人的眼睛或者镜头,会形成一个反映现实场景的“象”。我们的眼睛或者镜头,接受光都是有一个节奏的,会接受一下,不接受一下,即是说,我们看到的画面其实是断裂的一张一张画面,并不是我们通常以为的连贯的动态。只是这些断裂的画面,会被我们的大脑理解成一个运动的过程而已(视觉暂留现象)。
假设我们每次观察最短持续时间是0.01s,在这0.01s里,有个小球从a点跑到b点;如果小球跑的很慢,a点和b点几乎重合,我们眼中的小球就比较清晰;如果小球跑的很快,a点和b点离得很远,那么我们看到的小球,每一张画面,都是一条从a到b那么长的拖影。
如前文所说,运动模糊是在现实生活中随处可见的现象。为了让我们做的片子视觉效果真实可信,合理的运动模糊是必不可少的。
我在这里再举一个例子让大家更深刻地体会这一点。我们都知道,一般动画或者电影用的帧率是24fps,即每秒钟播放24张静止的图片,连着播放看起来就像是动态的画面。但是,在游戏中呢,一般的帧率要尽量保证在60fps,即每秒钟播放60张静止画面,如果低于这个数值,哪怕是40fps,玩家也会觉得卡得动不了。这里似乎就有冲突了,为什么动画用24fps觉得很流畅,而游戏必须要60fps才行呢?两者差这么多。
聪明的朋友在这里估计已经猜出个大概了。原因确实是在于运动模糊。一般的电影拍摄,因为使用的硬件设备,是必然会有运动模糊的。动画片,制作精良一点的,也都会有运动模糊,包括二维动画,甚至漫画,你看到的所谓的速度线,其实都是运动模糊的艺术化处理手法。
但是在游戏里,因为机能限制,早些年根本没有运动模糊这种东西的。直到近几年,一些3A大作,才慢慢普及了运动模糊。而这个时候你就可以去观察一个现象,当你开启游戏里的运动模糊效果时,就算你的画面帧率降到30fps,你也不会觉得卡。我也是以前在玩《蝙蝠侠:阿甘之城》的时候第一次观察到这个现象,后来经过仔细思考得出这样的结论,最后又查到一些资料论证了我的猜测:运动模糊可以降低画面帧率而感觉不卡。
那么运动模糊怎么会有这种奇效呢?首先,人眼每秒钟可以接受60张左右的画面,所以,游戏画面设置在60fps看着不会卡。那动画和电影的24fps+运动模糊怎么就不卡?是因为电影里的一帧,因为有运动模糊,涵盖的信息量其实是包含一个片段,而不是只有一个静止状态的。再回想下上面的图片,小球从a点到b点的运动,很快的时候,运动模糊包含的信息是a到b这一段距离,而如果没有运动模糊,你只能取一个点,可以想象,画面就会断断续续,就会卡。所以说,动画和电影,虽然只有24fps,但因为有了运动模糊,却可以涵盖整个运动过程的全部信息,所以看着不会卡,甚至很舒服。而如果你做动画的时候,不加运动模糊,想一想用24fps去跑的游戏吧,画面效果不忍直视啊。
包括在三维软件中直接渲染运动模糊,它会给你在两个最小时间帧里继续细分时间,把之间的画面也给你渲染出来,然后经过一些差值的算法得到一个模糊的过程。所以,这里也印证了,运动模糊可以涵盖掉一整段的运动信息。同时也说明了,为什么三维软件里直接渲染运动模糊,渲染时间会成倍上升了!
到这里,理论知识就算大概普及了。感谢大家又看我啰嗦了一大堆,相信大家有耐心看完的,都已经意识到运动模糊在动画里是有多么的重要了!不要走开,之后是更精彩的实际操作。
实际操作部分:
1)在Mental ray中做准备
首先我们讲讲如果使用Mental ray的话,操作方法应该是怎么样的。Mental ray中有三个跟运动模糊有关的通道,分别是2D Motion Vector、3D Motion Vector、Normalized 2D Motion Vector。到底选择哪一种,要根据你使用的后期软件来决定。如果是使用AE,那么就要使用Normalized 2D Motion Vector;如果使用的是Nuke,那么就要使用2D Motion Vector。而3D Motion Vector要在哪里用,我也是没有查到。
我做了一个简单的场景来讲述如何使用这些通道。
场景渲染出来的基本效果
2D Motion Vector视觉效果
Normalized 2D Motion Vector通道视觉效果
做了粗略的运动模糊以后的视觉效果
2)Motion Vecotr通道所代表的含义
那么这些红红绿绿的motion vector通到底是什么意思呢?其实他们只是用图片来装载信息,图像本身并没有识别的意义,有点像法线贴图的意思。用Normalized 2D Motion Vector通道来说吧,首先蓝通道是不会使用的,所以蓝通道里装什么都没关系,默认情况下,蓝通道会填充满50%的灰,或者在某些软件里也会完全舍弃,变成0;红通道和绿通道的默认值也是0.5,当某个像素的红通道数值小于0.5的时候,软件会理解这个像素向左跑,数值越小跑的越快;当某个像素的红通道数值大于0.5的时候,软件会理解这个像素在往右跑,数值越大跑的越快。同理,绿通道是数值大于0.5向上跑,小于0.5向下跑。取值范围当然在0到1之间(或者用ps的理解是0-255)。
上面是我在AE中的截图,AE将Normalized 2D Motion Vector的蓝通道舍弃,全部为0。于是,如果一个图片上没用东西动的话,颜色应该是(0.5,0.5,0)或者(128,128,0),即是你看到的大面积的黄色,有些地方又有些别的颜色,则表示在进行一些运动。
对于Normalized 2D Motion Vector通道来说,我们还可以对图片进行一定程度的分析来理解它的含义。而2D Motion Vector通道则更难理解,因为它不像Normalized 2D Motion Vector通道一样,取值范围在0到1之间。2D Motion Vector没有取值范围,保存的是浮点数据,可以理解为,可以容纳无限大的数值,也可以容纳无限小的负数!是的,2D Motion Vector有些地方其实是负值,所以,正常人看图片是无法理解这张图的含义的,它只能拿给计算机去计算用。
那么Normalized 2D Motion Vector通道和2D Motion Vector通道又有什么区别呢。所谓normalized,翻译过来叫做标准化,在计算机领域里,一般都是指把某一个范围的数值映射到0到1的范围之内。比如说,你的最小值为-500,最大值为500,normalized以后,最小值变为0,最大值变为1,原来的0变为0.5,原来的250变成0.75,原来的-250变成0.25了。所以,这两个通道承载的内容其实是没有本质区别的,只不过数值分布的空间不一样。而不同的后期软件有自己对数值的偏好而已。
3)在AE中合成你的motion vector通道
在AE中我们要使用一个叫做rsmb(real smart motion blur真的聪明运动模糊)的插件来实现运动模糊效果。这个插件可以识别我们渲染出来的motion vector通道。具体的操作是你对你的颜色层使用RSMB插件,在跳出来的属性面板里,使用的图层选择你的Normalized 2D Motion Vector通道,max displace(最大位移)的值跟Maya中的数值要一致,一般默认为256,blur amt(blur amount模糊程度)的数值默认0.5,这个数值你可以理解为运动模糊效果的强度,越大越强,别的就不用考虑了。
运动模糊本身的设置是只有这么简单,现在我们已经可以得到不错的结果,但是还是有很多的问题等待我们去修正。
比如说,这个案例里,我做了一个小球跳动的动画,同时摄像机也用运动,但是在后期做运动模糊的时候,却只能看到小球模糊了,而别的东西都没有模糊。观察2D Motion Vector通道也会发现,只有球有运动信息,别的地方都没有。这种效果当然是不正确的。
动画中某一帧的画面
该帧对应的2D Motion Vector通道
4)如何正确使运动模糊通道记录摄像机运动信息
那么该怎么修正呢?很简单,在Mental ray中,你的primary renderer默认是raytracing,这在大部分情况下都是很好的,但是对于我们现在这个案例,却会导致我们的运动模糊通道不计算摄像机的运动。所以,我们得切换到scanline扫描线作为我们的primary renderer。虽然说是扫描线,但是需要使用光线追踪的地方,mental ray还是会使用raytracing去计算的,不用担心渲染不好反射折射这些。大多数时候我们改成scanline都不会有什么影响的,只是在这个案例里你必须改成scanline才能记录摄像机的运动信息。
讲primary renderer改成sanline以后,2D Motion Vector通道获得了正确的信息
在Maya2013版本以及其以前的版本中,这个指令在features标签栏下面的primary renderer里选择。但是在Maya2014和Maya2015版本中,这个选项转移到了quality的legacy options里面了,默认还不能勾选,你需要把sampling mode改为legacy sampling mode才能勾选。勾选了以后渲染出来的motion vector通道就正常了,并且在后期做的运动模糊效果也正确了。
5)如何分层渲染运动模糊通道
除此之外,还有一些别的问题。我做了一块透明的挡板,当我的主体,运动的球体,从透明的挡板前面跳过的时候,出现了明显的错误:被遮挡的部分运动模糊的强度远远不够。
产生这个错误的原因是,运动模糊通道只会记录模型上的点的位移信息,不会考虑你这个东西是不是透明的。于是,被挡板遮住的球体,运动信息会继承静止的挡板,于是就出现了不正常的模糊效果。
另外,在某些帧也会看到,快速运动的球体,边缘的模糊效果会有一种割裂感,明显看着不对劲。
那么产生这个问题的原因又是什么呢?主要是我们现在的做法,直接对一个颜色层做运动模糊效果,球运动的速度和地面运动的速度差异非常大,后期软件在计算这种运动速度差别很大的物体叠在一起的情况的时候,处理的效果往往很糟糕。
那么该怎么解决?解决这两个问题的方法是一致的:对场景中的物体进行分层;地面一层,快速运动的球体一层,透明的挡板又一层。然后分开做运动模糊效果。这样,每一个单独的物体都会得到自己正确的运动模糊效果,并不会相互影响而出现图中所示的拙劣的计算结果。最后再把它们合成成完好的结果。
具体的操作步骤和之前说的一致,只不过要对分开的每一个图层进行单独的一次操作,操作数量可能有点多。而且如果你的场景同时还要做景深的效果的话,那么设置可能更加复杂一些。你要对每一个单独的层做景深和运动模糊,并且,要对你的z通道做运动模糊(不然颜色层运动模糊了,而z通道层还是清晰的,二者不一致,就会导致景深出问题,虽然很多时候并不一定观察得出来。)
关于后期景深的做法,我在之前也出过教程详细地讲解过,没看过的同学这里有传送门:
后期景深基础篇,教程地址:
9)VRay中输出多通道的exr文件
如果你使用的输出格式是exr(multichannel),那么你就会将所有的通道打包在一起。这个时候,你的velocity通道更像是前面说的Normalized 2D Motion Vector:以0为静止,正值右上,负值左下。是更适合nuke的数值储存方式。在nuke中的操作方式也可以参考之前mental ray部分的讲解。
那么问题又来了,如果我强行要在AE里面做呢?相信聪明的朋友已经领悟了,就是给velocity通道的数值全部加上0.5!是的,你可以用色阶工具,把output黑的一端拖到0.5来实现,或者新建一个半灰的固态层,用add模式叠加在velocity通道上来实现。或者你可以找一些自己的方法,只要实现效果都可以。
10)后期运动模糊的局限
因为毕竟是在后期软件里模拟的效果,能力有限。所以还是有一些效果是无法实现的。比如说一个人在镜子前面跑,人可以做后期模糊,但是镜子里的人却不能模糊。看到这里的朋友应该能自己想明白个中道理了。
还有折射的问题,复杂物体的折射往往也非常复杂,基本无法后期去模拟运动模糊效果。
遇到以上问题,直接在三维软件里面渲染吧,就目前来说,哪怕再慢也只能接受。
最后还有影子的问题。影子总是会被当做地面或者投影上去的物体的一部分跟着移动,但是常识告诉我们这是不对的。如果一个人在跑步,摄像机不动,你在后期做运动模糊,就会看到一个静止的影子。这算是比较常见的一个问题的,但还好这个问题是有解决的可能的。你可以把运动的影子单独分层出来,用一些方向模糊之类的滤镜去模拟运动模糊的效果,毕竟不是模型,没法获得它的运动信息的。当然你还可以使用RSMB pro插件,注意这个效果跟我们一般用的RSMB pro vector不一样,他不需要你输入一个有速度信息的通道,而是只要你有一段动画,就会智能给你计算模糊,而且很多时候计算出来的效果非常给力,是真的很聪明的运动模糊!你可以尝试对影子层单独使用RSBM pro,效果一定可以。
结语:
那么这一期的分享到这里就告一段落啦。有什么问题可以来我的微博和博客提问。
新浪博客:@戴老师的渲染作坊
说实话,这一期的教程花了我相当多的时间和精力,并不是内容有多难多复杂,主要是涉及到两款渲染器和两款后期软件,工作量有点大,光写文档就花了我两天多的时间了,之后还要录视频什么的,而且我一旦开始做,就想要做到很好。所以我的内容非常多,讲解很细致,我完全可以把很多点都一笔带过的,但是就是怕一些新手朋友看不懂。哪怕我自己多敲一些字,多说一些话,能够解决大家心里的疑惑,我就满意了。在做这期教程的过程中,有很多时候也感到疲惫和痛苦,也会浮现很多想要放弃的念头。但是每次回忆起自己最开始学这些软件的时候,因为这样一点点的简单的问题而通宵在网上找答案,往往一个问题要花上两三天时间却只为了那么简简单单的一句答案而已。我就会想到还有多少网友和曾经的我一样,正在计算机屏幕的那一头苦苦地思考着,搜索着,只为了得到这么几句话就能说清楚的答案。
有一句话叫做,朝闻道夕可死,说的就是获取知识的快感。我作为整理和传播知识的人,同样也有这种超越于吃喝和活塞运动之上的快感。这是驱动我做免费分享的源动力。其次是大家对我所做工作的认可和鼓励,也一直让我坚定我做的事情是有意义的。
不知道最近大家有没有看《星际穿越》,电影的最后,主角意识到,指引他去NASA,希望他不要离开女儿,把问题的答案传递给女儿的,并不是什么高级外星文明,其实就是未来的自己!是他自己亲手拯救了自己拯救了人类。
这种感觉,很像小时候看《哈利波特3》(全系列我最最喜欢的一本了,也是因为我要说的这一段剧情),哈利波特在湖边差点被摄魂怪杀死,关键时刻被一个男人救了下来,那个男人使用的正是他父亲守护咒,哈利波特于是一直相信自己的父亲还活着。小说的最后,哈利波特穿越回过去,站在湖边看着倒在湖边曾经的自己,期待着父亲的出现,来拯救自己,他是多么渴望看到父亲一眼。然而那个期待的人却一直没有来,直到最后的最后,他才瞬间恍然大悟,那个人不是他父亲!就是现在的他自己!于是他念头咒语发动守护咒,多少次都不能顺利发动的咒语,这一次却充满了异常强大的能量。他保护了曾经的自己!
有时候,我做教程,似乎也有这样一种感觉。虽然过去的我不可能看到现在的我的教程,但还是有千千万万的朋友会像曾经的我一样,在我的教程里受益。
哪怕你对外界有多大的期待,等到最后那一刻,你会发现,拯救自己的,还是你自己。
在后期软件中制作运动模糊(理论篇)
在后期软件中制作运动模糊(mr操作篇)
在后期软件中制作运动模糊(vray操作篇)
项目文件地址