渲染器详解 

2007-01-19 13:23 发布

2448 1 0
前言
Render是3D软件最后输出结果时必经的一道手续,也是最后一个相当重要的关卡,如果掌控好的话,可以让您在短时间内达到最佳的结果,但是万一没有好好地去拿捏参数,可能是赔了夫人又折兵,不但平白损失了时间又获得不满意的结果。有当过兵的读者,一定曾背颂过用枪时机,同样地在Render里我们也有算图时机,因为不同的设定会符合不同的需求,这也为何Maya后来整合了Mental Ray以弥补在需求上的不足。至于这两种算图引擎,到底适用在什么样的场合上,就让我们来探讨一下。
Shadow
Light和Shadow一直是相互作用的环境因素,并且对于整个气氛的营造有相当大的影响力,因此我们在设定不同的场景时,会搭配不同的灯光与阴影的效果。例如在室外景,强烈阳光所产生的阴影效果是较为锐利的,但是相对于室内景中的柔和灯光,所产生的阴影却是呈现另一种风貌,当此阴影离物体越远时会产生越模糊的效果。有关Shadow在Maya的产生方式,我们利用下图来做解释
在产生阴影之前,会在灯光处建立一张Depth Map,此Depth Map会记录下不同物体和灯光之间的距离,越白的颜色代表靠近灯光,越黑的颜色代表远离灯光。之后测量值(白色箭头)会和存贮深度的数值(黑色箭头)做比较,当测量值的距离大于存贮深度的数值时,那么这一个点就是产生阴影的位置。
Maya Software Shadow
当Maya在计算这些深度信息,如果产生了不正确的数值时,就有可能会出现Self-Shadow的问题。以下图来解释
当取样值在物体表面上存贮一个Dmap深度资料,但是因为一个pixel所含盖的范围大于此深度资料,因此会造成深度资料不正确的情况发生。如果以深度资料当作基准点来说,当资料比基准点还近时,则会出现白色,但是如果比基准点还远的话,就会出现黑色;因此即使在一个平面上,也会因为Self-Shadow的原因而造成类似波纹或条状的情况发生。一般解决Self-Shadow有两个重要的参数,一个是Dmap Bias,另一个是Use Mid Dist Damp。当我们提高Dmap Bias参数时,最主要是让远于Dmap深度的点往前提前,如此便能确保黑白点都比Dmap深度数值更接近灯光,因此便能校正Self-Shadow的问题(图4);但是在使用上不可将Dmap Bias的值设的过大,不然会造成阴影脱离物体表面,让物体产生飘浮在空中的错误情况发生。另一个方法Use Mid Dist Damp,是直接取两片表面的中心点来当做Dmap深度的基准点,因此不管黑点或白点,一定会比基准点还接近灯光,因此也就不会有Self-Shadow的问题了。
当一个物体能产生出立体感,那是因为物体有深度的关系,也因为有这个深度因素,才能表现出物体的阴暗面。在Maya Software Render中使用两种方式来制定阴影,一种是Depth Map Shadow,另一种是Raytrace Shadow;这两种阴影最大的不同点是,Depth Map Shadow是在算图之前就已经产生了,但是Raytrace Shadow是在算图的过程中才产生的。因此在速度上Depth Map Shadow是比Raytrace Shadow快很多,但是在品质上则是以Raytrace Shadow较好。对于这两种阴影的限制,我们以下就分别来做说明:
Depth Map Shadow最常使用到的参数就是Dmap Resolution,其实这就是Depth Map的图档大小;当Dmap Resolution数值很小时,就代表将一张小图档贴在一片大的表面上,因此所产生出来的阴影会造成严重的锯齿化;解决方法之一就是提高Dmap Resolution的数值。但是如果场景过大,迫使必须一直提高Dmap Resolution数值,才能获得较佳的阴影品质,此举势必会影响到算图的速度,其实最快的解决方法就是点选地板,将属性编辑器Render Stats栏位中的Casts Shadows关闭即可,在此并不需要调整任何Dmap Resolution数值。另外如果要产生柔边的阴影,当Dmap Filter Size数值使用过高时,也会影响到算图的效能,最好的方式是降低Dmap Resolution数值,再搭配低的Dmap Filter Size数值。以下图为例
最后阴影柔边的结果并没有什么差异性,但是较高数值的Dmap Resolution和Dmap Filter Size,却是在算图上足足慢上四倍的时间
Depth Map Shadow所产生的阴影柔边效果是全面性,并无法产生出渐渐柔化的效果,并且对于有透空贴图的物体,也无法计算出有透空的阴影,因此这些有特殊需求的阴影,就得靠Raytrace Shadow来达成。由于Raytrace Shadow的算图时间较长,除非有这四大需求才会动用到它:1.要产生出有透空贴图物体的阴影;2.要产生出有彩色透明的阴影;3.要产生出渐渐衰减的阴影;4.希望Ambient Light能产生出阴影
有关产生彩色阴影的部份,必须在材质的Transparency贴上一张彩色贴图才可以呈现。至于如何控制衰减的阴影,可以藉由Light Radius和Shadow Rays这两个参数。Light Radius主要控制衰减的程度,数值越大会越明显;Shadow Rays主要控制阴影的品质,数值越大品质越好,但是相对地算图时间也会提高
Mental Ray Shadow
在Mental Ray中同样提供了Depth Map Shadow和Raytrace Shadow,至于Mental Ray所提供的这两种Shadow到底好处在哪里?又有那些功能是Maya Software Render所达不到的呢?接下来我们就分别来做探讨。Mental Ray的Depth Map Shadow基本上的演算法和Maya是类似的,只不过它在产生阴影的准确度较高,最明显的一个部份就是Self-Shadow的问题,在Mental Ray中已经解决了Self-Shadow的问题,因此并没有Self-Shadow的参数提供使用。在Motion Blur方面,Maya Software render无法计算出有Motion Blur的影子,这方面唯有使用Mental Ray才可以做到。以下图来看不同演算法的结果
Raytrace Shadow不但在动态模糊的表现上比Depth Map Shadow还来的正确,它也可以表现出有透明度物体的阴影 ( 此物体有设透明度,在Raytrace Shadow的颜色比Depth Map Shadow的颜色还淡 )。有关在Volume质量光部份,也唯有Mental Ray的Raytrace Shadow,才能算出穿通过透明贴图的结果,这部份在Maya和Mental Ray的Depth Map Shadow是无法办到的
Light
有关在灯光方面,我们可以将Maya所提供的render定义为『直接照明』,将Mental Ray所提供的render定义为『间接照明』。( 所谓的『直接照明』就是光线直接在物体或是场景上所产生的亮度;至于『间接照明』是光线经由物体或是场景之间的反射和传递所产生的亮度 )。Global Illumination就是使用到『间接照明』的技术,而Caustics也就是『间接照明』的所呈现的效果之一。那什么是Caustics呢?简单的说,Caustics可以定义为一种聚光的效果,例如光线穿通过折射的玻璃杯,所呈现的聚光效果
或是金属反光在其他表面所产生的光影效果;或是在泳池中的水波反射到磁砖的光影效果,这些都可以称为Caustics。有一点注意的是,Directional Light并不支援Caustics的演算法
Global Illumination
Global Illumination和Caustics并无法经由一般的Raytrace来计算出结果,Mental Ray为了解决此问题,使用了一种叫Photon Map的方式来计算。同样灯光是光的来源,但不是使用灯光的强度(Intensity)来照明,而是以光子(Photon)来当做传播的能量,我们可以想像这些光子如同上油漆的弹力球一样,会在环境中一直反弹着,直到能量被吸引掉或消失在无限的距离时才会终止。而这些光子在反弹过程中,会将能量记录在Photon Map里,以做为运算场景时所需的照明。以图为例,此两张图的灯光摆设完全相同由上往下打,但是在结果上却有明显的差异。以间接照明来说明,因为光子打在地板反射的原因,才会造成球体的下半部较为明亮,另一方面在环境中并没有设定顶盖,因此球体并没有来自顶盖的反射,这也是造成上半部黑暗的原因
由于Global Illumination是属于间接照明,因此在呈现上并没有像直接照明那么直接,通常必须经由反覆地测试才可以得到满意的结果。以下就简单地来介绍一下,某些重要的参数设定及步骤,至于数值只是提供参考,因为整个结果会依不同的场景大小而改变。一开始将Spot Light的Intensity设为0,并勾选Emit Photons;至Render Globals 的mental ray,将Quality 改为PreviewGloballlum
接下来我们分四个步骤来调整:1.调整Energy和Exponent数值;Energy三个栏位代表RGB数值,如果数值提高代表能量加强,会让反弹次数变多使整个画面变更亮。Exponent代表衰减值,数值增加代表衰减越快。2.调整光子颗粒大小,以上图来看,最左边那张图可以很清楚地看到一颗颗的光子的形状,经由调整光子的Global Illum Radius数值可以解决此问题,当数值增加到没有任何改变时,我们就可以往下一个步骤前进3.调整Global Illum Accuracy:此参数最主要是提供光子之间的混合程度,当数值越大溶合的程度就越好,当画面已经生现较柔和的结果时,我们就可以进行最后的一个步骤4.增加Global Illum Photons的数量。有关调整四个步骤的参数值,都是等一个参数调整到没什么改变时,才会接下去另一个参数来调整
Final Gather
Final Gather同样也是属于间接照明的一种,它可以和Global Illumination一起共用或是单独来做运算。有关Final Gather的演算法,它会认定于场景中的每一个物体,都可以当做是一个灯光的来源,因此在场景中不需要任何灯光,就可以达到照明的效果。但是Final Gather和Global Illumination有一个最大的不同点,Global Illumination会藉由光子在环境中重覆地反射,但是Final Gather只会藉由光线(Ray)做一次投射。因此Final Gather Ray可以将物体颜色或灯光的漫射,传递到另一个物体上,但是这只允许针对第一个表面,对于从第二个表面就不会有反射的效果了
Final Gather通常会使用一个半球体来当做照明的来源,在半球体表面上的每个点,都可以想像为直接照明的每盏灯光,但是如果Final Gather都对每个点来做运算时,就会如同场景中布满了灯光一样,肯定会造成相当大的算图负担。因此为了增加算图的效能,Final Gather会以一个区域的点来做为取样的平均值,至于定义这个区域的范围大小,就是使用Min Radius 和Max Radius这两个参数来决定;一般Max Radius的数值可以取场景的10%来做为大小,Min Radius的数值则是取Max Radius的10%来做为大小。有关Final Gather的使用时机有下列几种状况:1.适合使用在灯光没有做大幅度改变的环境下,及在一个灯光漫射的环境里。2.解决因为Global Illumination所造成影片闪烁的问题,和较低光子数目的环境中。3.为了求得更好更细腻的画质。4.与Global Illumination结合使用,以获得更拟真的画面。5.为了获得令人信服的阴影效果。6.为了排除阴暗角落的问题
接下来我们用一个简单的场景来介绍Final Gather,在场景中除了圆球、地板和Directional Light外,另外有一个半球体来做为环境的灯光来源。在材质的设定上都以Lambert为主,颜色部份将半球体设为蓝色,圆球设为红色,地板设为白色。首先至Render Globals 将Render Using 改为mental ray,并勾选Final Gather启动其算图设定。首先我们先测试一个没有灯光的环境,将Directional Light的Illuminates By Default选项取消,提高半球体材质的Incandescence数值,让整个场景的光源来自于半球体。有关Final Gather rays的数值会取决于最后的影像画质,当数值越高所获得的画质越佳。在一般做测试时我们可以将Final Gather rays降低为100以加快算图的速度,等最后确定后再调高其数值。有关要让物体颜色渗色(Bleed)到其他表面时,可以调整其材质的Ambient Color或是Incandescence。以图为例,如果我们希望红色圆球的颜色投射到地板上,有两种作法;一个是提高Ambient Color的明暗度(V)数值,另一个是调整Incandescence的颜色为红色,并调整其明暗度数值,这两种方式最后所计算出来的结果是相同的
接下来测试开启灯光后的环境,先勾选Directional Light的Illuminates By Default选项,将半球体材质的Incandescence数值设为0,让整个场景以灯光来影响照明。此时灯光所照射的角度,会因为所照射到的物体而影响到最后的算图结果。以下图来解释,当灯光往上打时,半球体会接受到大部份的灯光,因此地板会因为半球体颜色投射而呈成现蓝色;在圆球部份,因为灯光打在下半部,因此会造成红色很强烈地投射到地板上。右边那张图显示灯光往下打,现在大部份的灯光都打在地板上,因此圆球下半部会因为地板投射,在边缘上会呈现较为明亮的颜色;在半球体部份因为获得较少的光源,因此地板只有在边缘部份才看得到泛蓝的颜色
在每个材质内的mental ray栏位有一个Irradiance Color参数,此参数最主要是用来控制渗色的程度;以下图来做解释,当降低地板的Irradiance Color时,地板会因为无法接受到其他物体所投射来的颜色而变成黑色;但是当Irradiance Color设为100%红色时,地板只会接受红色圆球所投射出来的颜色,其余部份会以黑色来显示同样的当Irradiance Color设为和半球体相同的蓝色时,地板只会显示出蓝色的部份,至于红色圆球所投射出来的颜色,则以黑色来取代
至于红色圆球所投射出颜色的多寡,则是由本身材质的Ambient Color来决定
HDRI
HDRI为高能量范围影像(High Dynamic Range Image)的缩写,它虽然看起来和一般图档一样,但是里面却大有文章,其实HDRI是由不同曝光值影像所组成的影像
因此它在定义颜色范围上会比传统的影像(称为LDRI低能量范围影像)还来的大很多。HDRI和LDRI的最大的不同点,就是它的RGB Channel数值可以是浮点值,不像一般影像是以0~255整数值来定义颜色,因此HDRI影像可以包含比24位或是32位更高的信息。关于颜色定义方面,由于HDRI并不局限于(0,0,0)黑色,(255,255,255)白色的限制,对于每个Channel的数值就算是超过255还是属于合法值,也因此在表现物体的高反光亮点方面,会比一般LDRI所产生的反光点还来的真实;另一方面在一般看起来全黑的影像中,如果以HDRI来表现,依旧可以在黑暗中看到一些明亮的部份
有人说HDRI是可以"发光"的,其实这种说法并不正确,正确的说法应该它是张照明贴图(Lighting Texture),当它搭配Final Gather的演算法之后,图档上的明暗及色彩资料就如同是每盏灯光一样,因此Final Gather会以这此信息来当做灯光的依据,由于这些灯光是来自四面八方的,也因此所投射出来的光线会更趋近于自然光
我们用一个简单的场景来介绍HDRI与Final Gather的应用,在场景中有一个地板,一个戒指和一个做为照明的球体。首先产生一个Lambert,在Ambient Color内使用File Texture方式贴上一张HDR的图档,将Diffuse值设为0,将Color设为全白,最后将此材质指定给球体来当做照明。在地板部份产生一个Lambert,将Color及Bump Mapping上贴上一张木纹贴图,将Diffuse值设为0.15,在这里不能设为0,因为如果设为0时就不会反应出本体色而造成全黑的结果。对于戒指部份,产生一个Blinn材质,将Color设为全白,Ambient Color 的V值为0.15,Diffuse值设为0,至于戒指上的反光亮点可以藉由HDR图档来呈现,因此我们可以将产生亮点的参数Eccentricity设为0,将Specular Roll Off设为1,Specular Color设为全白,将Reflectivity设为1。至Render Globals 将Final Gather开启,将Final Gather rays设为100,再执行Render后得到如下图左边的结果。如果要模拟出金属反光在木头上的Caustics效果,则必须加一盏Spot Light将Intensity设为0,并勾选Emit Photons,至Render Globals将Caustics开启,最后算图的结果如图右边,在戒指内圈的地方可以很明显地看到Caustics的效果
B Color Smilies

全部评论1

你可能喜欢

渲染器详解 
联系
我们
快速回复 返回顶部 返回列表