本页面由 Flash 保存计划 从 Internet Archive 存档还原 · 快照 2011-03-09 · 原址 http://www.flash8.net/teach/8451.htm ← Flash 保存计划

原理教程:影视动画渲染中的运动模糊(下)

作者:CG风火连城   类型:转载   来源:火星时代

  原理教程:影视动画渲染中的运动模糊(上)

导言:

大家好!我们继续来学习影视动画渲染中的运动模糊的下半部分知识。

计算机动画中的运动模糊
计算机动画中生成运动模糊图像的方法基本可以分为两类:传统的三维渲染运动模糊(3D Motionblur)以及后期处理的2D矢量运动模糊(Post-Processing 2D Motionblur)。在传统的三维渲染运动模糊中,基于光线跟踪的运动模糊算法是最接近物理真实的方法之一,以最经典的光线跟踪渲染器Mental Ray为例,其在光线跟踪模式下计算运动模糊的原理简单的说是首先根据快门时间(Shutter Open—Shutter Close)(shutter 0 1用于表示正常曝光值,shutter 0 0.5用于表示曝光时间为正常值的一半)决定运动模糊的强度。(图13)

图13

然后根据时点采样(temporal sample)决定在一次快门闭合时间内采样的精度。(图14)


图14

最后通过插值、抗锯齿与像素过滤处理生成最终的图像。(图15)

图15

 

在一次项目渲染中,经过笔者测试,Mental Ray在光线跟踪模式下为了得到高质量的运动模糊渲染结果需要付出大量的渲染时间作为代价,特别在开启渲染器高级光效比如Final Gathering的情况下,开启运动模糊渲染所消耗的时间为不开时的五倍以上,并且内存占用量明显增加,在机器配置不变的情况下已经无法按照既定时间完成渲染任务,因此不得不另想方法来实现运动模糊效果,最终借助后期软件完成了运动模糊的添加工作,也就是计算机动画中生成运动模糊图像的第二类方法——后期处理的2D矢量运动模糊(Post-Processing 2D Motionblur)。

后期处理的矢量运动模糊的基本工作原理是通过提取屏幕像素的运动趋势并记录为运动矢量信息(Motion Vector),来对原始无运动模糊的图像在后期软件中添加二维的运动模糊效果(图16、17、18)

图16

 

图17

 


图18

Motion Vector是什么?
通常有两种Motion Vector信息,一种叫做Normalized Motion Vector,其经过归一化处理(normalized)将数值映射到0~1的范围内;一种叫Raw Motion Vector,所记录的数值代表像素的实际运动距离。本文所提到的Motion Vector一律指的是Raw Motion Vector。

一张包含Raw Motion Vector信息的图片通过使用两张灰度图并将这两张灰度图合并到一张图像上来记录场景中所发生的运动方向及强度。

其中一张灰度图通过记录物体像素在给定快门时间内在X轴向上的位移(水平运动)强度(单位为像素,负值代表沿着X轴向左运动,正值代表沿着X轴向右运动,绝对值大小代表运动幅度)并将这张灰度图写入图像的红色通道。

另外一张灰度图则通过记录物体像素在给定快门时间内在Y轴向上的位移(垂直运动)强度(单位为像素,负值代表沿着Y轴向下运动,正值代表沿着Y轴向上运动,绝对值大小代表运动幅度)并将这张灰度图写入图像的绿色通道;一般蓝色通道不记录任何信息。

这样形成的一张Motion Vecotr图像类似图20,我们看到的是一张带颜色的图片,实际上图片里存储的是每个像素在XY轴的运动强度和方向。这里的X、Y轴指的是在后期软件屏幕坐标下的X和Y轴。

在了解后期处理的矢量运动模糊的基本工作原理后,我们得知该方法的实现必须基于三个主要环节:

1.是必须生成不带运动模糊的图像;
2.是必须要有某种方法去获取运动矢量信息;
3.是必须能让后期软件正确地识别渲染器输出的运动矢量信息并进行运动模糊的图像处理操作。

第一个环节不是问题,任何一款主流的三维软件都能够胜任不带运动模糊的渲染工作;第二个环节需要了解所使用的渲染器是否支持运动矢量信息的计算及输出,据笔者了解,输出矢量信息基本上是每一个主流渲染器都拥有的功能,只是计算方式有所不同而已;在第三个环节上,据笔者所知,AE、Fusion、Shake、Nuke、Combustion、Toxik这几款后期软件可以原生识别或者通过安装商业插件来识别三维软件渲染的矢量信息。

实际的项目制作中通常会遇到的问题是:本项目适合用什么样的方法去实现运动模糊效果?要回答这个问题,我们首先要了解三维渲染的运动模糊(下文均简称为“三维运动模糊”)和后期处理的2D矢量运动模糊(下文均简称为“后期运动模糊”)各自的优缺点才能够根据项目具体情况来做决定,以下是优缺点分析。

1.三维运动模糊能够计算曲线运动模糊,后期运动模糊不能,而这在类似直升飞机螺旋桨的处理上至关重要。在处理剧烈曲线运动的情况下后期运动模糊问题显著。(图19、20、21)

图19

图20


图21

2.三维运动模糊理论上可以通过无线提高采样精度来达到完美的模糊效果,但通常情况下时间不允许,因此三维运动模糊往往带有瑕疵(颗粒感),即使在好莱坞主流影片中也能看出采样次数不足而形成的瑕疵(图22、23、24、25)。

图22

图23

图24


图25

而后期运动模糊进行的是2D平面图像处理操作,因此只要花费很少的时间就可以达到完美无瑕的模糊效果。(图26、27)

图26

图27

3.后期运动模糊计算非常快,几乎是实时生成,在三维软件中渲染矢量信息序列速度也相当快,而三维运动模糊相当慢,需要消耗大量的渲染时间。

4.后期运动模糊不能处理运动物体的阴影,不能处理运动物体的折射反射,而三维运动模糊均可以渲染出运动模糊物体折反射及阴影的真实效果。

5.三维运动模糊的分层(通道)渲染及合成相对更麻烦一些,因为每一层(通道)都得带有运动模糊效果,且运动模糊图像的透明边缘在合成校色时容易变黑或变白。

总结为如下表格。(图28)

图28

根据以上的分析我们可以得出如下结论:在综合物理真实性方面考虑,三维运动模糊要优于后期运动模糊,因此追求极端质量的项目(如电影《变形金刚》系列、《阿凡达》、《Wall-E》)往往会花费大量的时间和硬件成本去渲染三维运动模糊;在速度上后期运动模糊要远胜于三维运动模糊。

因此在大多数的情况下,可以采用后期运动模糊+三维运动模糊结合使用的方案,常规镜头用后期运动模糊解决,部分特写及大动态的镜头用三维渲染运动模糊来搞定。

有一点需要特别指出的是:本文所指的“后期运动模糊”特指的是在三维中渲染矢量通道再到后期软件中根据矢量通道进行模糊处理的情况,而在实际生产中有一种类型的“后期运动模糊”指的是后期软件中使用图像跟踪分析方法,根据前后帧的像素信息自动计算出运动趋势再进行模糊处理的情况(例如:Nuke中的Oflow、F_motionblur这两个节点实现的功能),这种生成运动模糊的方法完全不依赖三维软件,但是对于复杂运动的分析能力有限,因此在缓慢或简单运动的场合效果不错,在复杂像素运动情况下会出现运动模糊失真的情况。这种类型的“后期运动模糊”本文不再赘述。

一套完整的后期运动模糊工作流程
该流程的操作思路是使用三维软件Maya中的Mental Ray渲染器输出运动矢量,然后在后期软件Nuke中通过VectorBlur节点将原始图片序列与运动矢量序列进行合成产生接近真实的运动模糊的效果。

准备工作
需要机器上安装有Maya 7.0及以上版本(自带Mental Ray渲染器),Maya相对应版本的shaders_p(Mental Ray节点功能扩展包)以及Nuke 4.7及以上版本。

Shaders_p是由俄罗斯人Puppet开发的免费的Mental Ray节点包,里面包含一系列能扩展Mental Ray功能、提升Mental Ray效率的shaders,shaders_p能够很好的工作在Mental Ray独立版以及主流三维软件Maya、Max、Xsi里,并且shaders_p支持以下若干操作系统平台:Win32、Win64、Linux32、Linux64以及macOSX,因此通用性很高。Shaders_p的各个版本可以在http://www.puppet.tfdv.com/download/index_e.shtml下载。

在本文中我们将使用Maya2009,配合shaders_p中的p_motion_to_rgb这个shader来生成运动矢量信息,其他三维软件的操作方法类似,最后通过nuke5.1v5进行合成。

Shaders_p在Maya中的安装方法:


1.关闭Maya;
2.将shaders_p.dll(linux或者mac下是shaders_p.so)拷贝到“maya安装目录”/mentalray/lib目录下(例如:D:\Program Files\Autodesk\Maya2009\lib);
3.将shaders_p.mi拷贝到“maya安装目录”/mentalray/include目录下;
4.将所有的*.xpm文件拷贝到“maya安装目录”/icons目录下;
5.将AE目录下所有的的*.mel文件拷贝拷贝到“maya安装目录”/scripts/AETemplates目录下。安装完成。

如果在渲染的时候出现类似如下错误:
“LINK 0.0 error 191007: cannot load C:\Program Files\Alias\Maya7.0\mentalray\lib/shaders_p.dll, This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem.”

请安装“Microsoft Visual C++ 2005 SP1 Redistributable Package”。下载链接:
Microsoft Visual C++ 2005 SP1 Redistributable Package (x86)
Microsoft Visual C++ 2005 SP1 Redistributable Package (x64)

Maya输出运动矢量信息
1.确认安装好shaders_p以后,打开Maya的Hypershade,创建p_motion_to_rgb节点(安装好shaders_p就会多出这个节点),将新创建的p_motion_to_rgb赋给运动物体,更改p_motion_to_rgb的Mode属性为Raster Space。(图29)

图29

2.打开Render Settings,切换渲染器为mental ray。在Common选项卡下将Image format更改为Maya IFF、TIFF或者OpenEXR格式,推荐使用OpenEXR,因其对32位浮点数据支持的最好,且只有OpenEXR格式支持16位半精度浮点数据。

3.切换到“Quality”选项卡,更改橘红色字体所示属性。(图30)


图30

Shutter Open和Shutter Close都设置为1是为了只计算运动模糊的矢量而并不将运动模糊应用到所渲染的物体上。
Motion Steps设置为最低值1是为了最小化渲染计算量,类似原理,Time Samples也可以设置为最低值1。
Custom Motion Offsets勾选的目的是为了能将Motion Back Offset的值设置为1。
Data Type设置为RGBA(float)4x32Bit(或者RGA(Half)4x16Bit)是为了支持矢量信息超过0到1范围的情况,而p_motion_to_rgb生成的矢量信息是未经过归一化的,因此值常常会超过1或者少于0。

Shutter Open、Shutter Close、Motion Back Offset这三个参数都设置为1能够确保物体在多轴向、带父子层级关系的复杂旋转运动时,仍然能够得到完全精准的运动矢量信息。

通常的输出运动矢量信息的方法是将Shutter Open、Shutter Close、Motion Back Offset都设置为0.5,这样的设置在某些场合会得到不完全正确的运动矢量信息,合成的时候会出现瑕疵。
渲染的抗锯齿级别和过滤器请设置为和你的最终原始图像渲染一样的设置!
Render Settings下的相关设置比较繁琐,整个设置过程可用以下的mel语句来完成:

//-----对于maya2009及以上版本:本mel在运行之前最好确认mentalray渲染器的Quality选项卡已被点击过一次(让maya加载mentalray入内存)
//-----对于maya2008:请运行本mel两次即可完成设置(中途会报错,可以无视)

//设置渲染图片的名称
setAttr "defaultRenderGlobals.imageFilePrefix" -type "string" ("<Scene>"+"_MotionVector");
whatIs changeMentalRayImageFormat;
//设置mentalray渲染格式为exr
setAttr defaultRenderGlobals.imageFormat 51;
setAttr -type "string" defaultRenderGlobals.imfPluginKey "exr";
//设置渲染器为mentalray
setAttr "defaultRenderGlobals.currentRenderer" -type "string" mentalRay;
//设置运动模糊模式为“full”
setAttr miDefaultOptions.motionBlur 2;
//设置快门及MotionBackOffset参数用于产生的运动矢量能精确匹配原图
setAttr "miDefaultOptions.shutterDelay" 1;
setAttr "miDefaultOptions.shutter" 1;
setAttr "mentalrayGlobals.exportMotionOffset" 1;
//设置渲染格式为RGBA(Float)4x32Bit
setAttr miDefaultFramebuffer.datatype 5;
//减少计算量的参数
setAttr "miDefaultOptions.motionSteps" 1;
setAttr "miDefaultOptions.timeContrastR" 1;
setAttr "miDefaultOptions.timeContrastG" 1;
setAttr "miDefaultOptions.timeContrastB" 1;
setAttr "miDefaultOptions.timeContrastA" 1;

4.设置完毕后后台批渲染输出运动矢量信息,并输出没开启运动模糊的原始图像序列。(图31、32)

图31


图32

进Nuke中进行运动模糊效果合成
节点链接。(图33)

图33

Copy1节点和VectorBlur1节点的属性设置。(图34)


图34

Mental ray渲染的纯三维运动模糊与Nuke合成运动模糊的效果对比。(图35、36)

图35


图36

生成Motion Vector的替代方法
如果使用的maya2009及以后的版本,除了使用shaders_p方法外,也可以通过Render Passes输出2D Motion Vector通道来生成运动矢量信息,操作方法是在Render Settings——mental ray渲染器下的Passes选项卡添加一个名叫“2D Motion Vector”的通道并关联到当前的render layer,之后将Common选项卡下的Image format改为“OpenEXR(exr)”,最后批量渲染输出,那么在输出的*.exr文件在原始的RGBA通道外还会包含额外的mv(Motion Vector)通道信息。

不过这种方法有一点需要特别注意:在渲染时携带2D Motion Vector通道输出图像时生成的运动物体的位置信息,和不带2D Motion Vector时生成的图片中运动物体的位置信息不一致!假设不带2D Motion Vector通道渲染出的图像中的运动物体记录的是位于第1帧、第2帧…第100帧的位置信息,那么携带2D Motion Vector通道输出的图像中的运动物体记录的是位于第0.5帧、第1.5帧…第99.5帧的位置信息,正好在时间轴上向左偏移了0.5帧,对于这个隐晦的“误差”Maya不会给出任何提示,这也是有些人认为2D Motion Vector通道不好用的原因之一。

解决方法:确认mentalray渲染器的Quality选项卡已被点击过一次(让maya加载mentalray入内存)后,在Script Editor中运行以下mel语句将Motion Back Offset参数设置为0。

这样就确保了无论是否携带2D Motion Vector通道输出都能得到一致的渲染结果。

该流程在项目《变形金刚2:大力神的崛起》及《末日战争》中的实际应用效果。(图37、38、39)

图37

图38

图39

总结
通过以上的操作流程,就可以实现Maya+Nuke后期运动模糊的输出与合成工作。笔者经过实际项目制作,证明在实际项目制作中该流程是切实可行的,并体现出后期运动模糊方便与快速的优势。另外,在实际制作中还需要注意到如果不同物体的运动在屏幕上看着有交叠(例如图39-40中大力神的左手和身体有交叠),那么为了避免瑕疵得到正确的运动模糊效果请将交叠的每个物体及其矢量通道分别渲染输出,到后期再进行合成。

在线投稿和咨询,联系闪吧编辑    责任编辑:silvia    时间:2010年10月25日
  • 最近更新