【渲染教程】详解在maya中制作玻璃材质

20 十二月, 2014
224
0
[隐藏]
这是我大概两年前些的一篇帖子。最早是发在maya贴吧,当时还没有使用博客。因为帖子的内容确实写得非常好,最近博客看的人多了一些,所以就把这篇教程重新发在博客里。因为当时也没有开始录视频教程,所以这篇教程只有文字。

这篇帖子讲述的内容主要使用maya 软件,以及mental ray渲染器。当时maya版的vray好像才出,都还不太好用呢。时间过得很快~

一、材质的基本原理:

一:能量守恒。

【基础教程】详解在maya中制作玻璃材质

在光线照射到某个物体表面的时候,总体上会出现三种反应:吸收,反射以及折射。其中反射又分为漫反射和镜面反射。

而所谓的能量守恒法则说的则是,能量不可能凭空产生也不可能凭空消失,只可能发生转换。

用在光线传播过程中则可以得到这样一个公式:入射能量=吸收能量+反射能量+折射能量。

其中,吸收的能量一般转换为热能,是我们不需要考虑的部分,将这一部分掠去,得到公式:入射能量>=反射能量+折射能量。其中,反射能量可以分为漫反射和镜面反射,而漫反射在我们cg制作过程中,一般为diffuse,而镜面反射一般为specular,而折射一般为refraction,令入射能量为100%,即为1。则可以得到最终我们可以使用的公式:1>=diffuse+specular+refraction.

二:所有反射都具有菲涅尔效应。
【基础教程】详解在maya中制作玻璃材质

引用下mental ray官方帮助文档的图。

菲涅尔就是你的视线和你看的面的夹角越垂直,则看到的反射越低,你的视线与你看的面的夹角越接近0度,则反射越高。

另外,决定菲涅尔效应的主要是折射率这个属性。当折射率越靠近1的时候,90度视角与0度视角的反射率之间的差别越大,当折射率数值越高的时候,90度视角与0度视角的反射率越接近1

一般透明物体的折射率在1.3-1.9之间,塑料、橡胶、烤漆也是这个范围左右。金属则是4-10,甚至更高。

二、使用maya基本材质实现玻璃效果:

这里使用大家最熟悉的blinn材质,运用前面讲的基本原理来制作玻璃。

首先是设置场景,对于高反射的金属或者玻璃等物体来说,基本上可以说不存在自身的固有色,这些物体之所以被看见,是因为反射或者折射周围的环境,于是,环境对于玻璃的制作来说是万分重要的。没有环境就没有效果。

这个场景使用hdr来进行照明。在mental ray中则是使用IBL节点。

关键设置如下:

开启IBL节点,如果FG没有自动开启,请手动开启。

【基础教程】详解在maya中制作玻璃材质

关闭场景的默认灯光,在common标签的最后。

【基础教程】详解在maya中制作玻璃材质

启用色彩管理,如下设置,开启线性工作流。

005HE0Kugy6OnYfOEc52d&690

渲染得到的结果。

【基础教程】详解在maya中制作玻璃材质

给模型一个blinn材质,并且调节transparency到全透明。

并且在raytracing option标签下开启折射,refraction,将折射率调节到1.7或者类似的一个数值。

得到一个很黑的结果。

【基础教程】详解在maya中制作玻璃材质

这是因为反射折射次数在默认情况下都设置得非常小。

为了讲解反射和折射次数,我做了一个简单的场景来说明。

【基础教程】详解在maya中制作玻璃材质

两面相对的镜子,中间有个小球。

镜子给的是高反射的材质。

【基础教程】详解在maya中制作玻璃材质

【基础教程】详解在maya中制作玻璃材质

按照我们的生活经验,两面相向而立的镜子应该是无限次反射才对,但是在我们的软件渲染出来的图可以看到,从一面镜子里面只能看到对面的镜子和小球,并且对面的镜子里的反射是没有的,反复对面的镜子不会反射一样。但其实这两面镜子我给了同样的材质。问题在哪里呢,就在反射与折射次数的限制。

当我们在渲染的时候,如果遇到像我现在使用的这个案例的时候,计算机如果按照生活里的经验去计算,那么就要无限地计算两面镜子之间的反射,那么渲染便永远不会终止。为了避免这种情况的产生,软件中引入了反射与折射次数限制来提高性能。

而这个限制则是由两部分构成的:全局设置以及单个材质的设置。当你打开mental rayquality标签,下面有个raytracingreflectionrefraction的值则分别对应会计算的反射和折射次数,而max trace depth则是这两个值相加的最大限制。比如两个值都设为10,但是max trace depth也设为10,那么折射和反射次数则不会达到20,而是不会超过10.

在高反射的场景里,一般会设置为10,10,20.

但是渲染了以后,你会发现结果没有变化,那是因为虽然你把全局设置改变了,但单个材质下面也是有限制的。

找到这个blinn球的raytrace option,下面有一个reflection limit,这个也是反射次数限制。

【基础教程】详解在maya中制作玻璃材质

reflectionlimit=0

【基础教程】详解在maya中制作玻璃材质

reflectionlimit=1

【基础教程】详解在maya中制作玻璃材质

reflectionlimit=2

【基础教程】详解在maya中制作玻璃材质

reflectionlimit=3

【基础教程】详解在maya中制作玻璃材质

reflectionlimit=4

【基础教程】详解在maya中制作玻璃材质reflectionlimit=5

你会发现这个数值设为几,那么反射就会进行几次。

调节了反射折射次数以后的结果,黑的地方消失了,不过反射折射还不好看。

首先根据开篇说的能量守恒法则1>=diffuse+specular+refraction

对于玻璃物体来说,是不存在漫反射的,有的都是镜面反射和折射。所以,先把color或者diffuse关掉,调成0,或者你可以都关掉。

其次玻璃是一个遵循菲涅尔反射的高反射物体。我们把反射率和specular color调到最高。在blinn材质中对于反射的控制是reflectivityspecular color共同控制的,只有二者皆为1的时候,才是全反射,任意一个值不为1,都会相应降低反射率,任意一个值为0,则反射率就是0

然后将specular roll off调节为0或者接近0。绝大多数人理解这个值为高光强度,其实这个理解是有偏颇的。这个值真正的作用其实是控制菲涅尔效应的。当该值为1的时候,90度视角与0度视角的反射率皆为specular colorreflection的乘积(90度视角与0度视角参见菲涅尔反射;乘积的原因是这两个数值共同控制真正的折射率);当该值为0时,0度视角的反射率为specular colorreflectivity的乘积,而90度视角的反射率为0

所以,这个值可以取代sampler inforamp节点来实现对菲涅尔的控制。(不相信的同学可以自己弄一个圆球,把这个值调到0,你会发现球体的边缘照样有反射,并且越靠近你的垂直视线,反射越低。)

【基础教程】详解在maya中制作玻璃材质

这个是将specular roll off调节到0,得到的渲染结果。即是已经有了菲涅尔反射的结果。你可发发现,杯子正垂直于你视线的面上的反射几乎已经看不到了,而同你的视线夹角非常小的面,依然有着很高的反射。

另外,在我这个案例中eccentricity这个值不产生作用,一般来说,这个值翻译成偏心率,控制的是高光的大小。但是这里所谓的高光,其实是三维软件虚拟出来的一个东西,因为你用了虚假的灯光,虚假的灯光照射在虚假的材质上面,于是形成了虚假的高光。但是你要按照我说的一步步地做,你会发现这时候调整这个数值不起任何改变。

因为我没有使用虚假灯光,你会发现这个场景里唯一的默认灯光在开始的时候已经被我关闭了,并且没有新建任何灯光,起到照明作用的是一张hdr贴图,以及FG的计算。

所有玻璃上能看到的高亮部分,并不是计算机通过虚假灯光位置计算出来的所谓高光,而是根据光线跟踪计算出来的真正的反射。这一部分我没办法更深入地说明了,并不是这篇想要解决的问题,只是附带提一下。如果想不明白也不要深究,很多人都不知道这些但依然能做出很棒的作品,条条大道通罗马。

回到玻璃的制作。我们已经制作了菲涅尔现象了,但是这个时候却有一个问题,这个材质并不遵循能量守恒:我的blinntransparency全是1,在90度视角的面上,反射是0,而在0度视角上反射是1。于是,在接近视角为0的面上,会有1的反射同时有1的折射,打破了能量守恒,也就是说反射与折射的光线反而要比入射的光线强烈,会得到不正确的视觉。

于是要用一个方法来纠正不同视角的折射能量,也就是透明度。这里使用sampler inforamp的经典方法。

【基础教程】详解在maya中制作玻璃材质

如图,将sampler infofacingRatio插入rampvCoord。设置ramp一端为白一端为黑。将这个ramp插入一个lambert给杯子渲染一下,你就知道这一套节点起什么作用了。

【基础教程】详解在maya中制作玻璃材质

可以看出来,杯子的边缘,也就是接近0度视角的地方,是黑的;接近中心,也就是接近90度视角的地方,是白的。

这套节点,可以控制不同视角的地方获得不同的值。

而现在的反射值是在0度视角也就是边缘的地方比较强,而90度视角,也就是中间地方很弱。为了满足能量守恒,得插入一个相反的结果到transparency通道中去,也就是让越靠近边缘的地方,透明度越低,而越靠近中心的地方,透明度越高。

刚才做的这套节点刚好合适,插入到之前blinn材质的transparency通道中去。

【基础教程】详解在maya中制作玻璃材质

得到的结果,感觉太黑了点,这个时候可以控制一下ramp上的颜色来调节到可以接受的结果。有人可能会说,如果这个时候调ramp上的黑白颜色,那么不是打破了能量守恒了吗?其实你用blinn材质做玻璃,根本无法精确控制能量守恒,可能你能让标准的90度视角与0度视角获得正确的结果,但中间过渡的环节你并不知道过渡到底该是线性的还是曲线的还是咋样的。其实菲涅尔现象的数值变化本身就很复杂,即不是线性,也不符合单一曲线,最精确的控制方法是输入折射率来控制菲涅尔,前文已经提到菲涅尔现象最主要是受到折射率的控制,这是一种物理属性。而在maya自带的简单blinn模型中,是无法实现用折射率精确控制菲涅尔现象的,更精确的方法将在后文提到。

顺便说一下,mayablinn材质给人的感觉挺奇怪,尤其是反射是有specular colorrefectivity两个数值共同控制,我觉得这些特性早就应该淘汰了。而新版本的maya从来不更新这些过时的东西,导致maya这个软件已经显得有点尾大不掉,并且学习起来会相对困难。

回到做玻璃上来,原因我已经说明白了,所以这里,我们不得不做一次所谓的艺术家,让结果看起来“正确”。

【基础教程】详解在maya中制作玻璃材质

你可能注意到,这个结果的杯底特别的黑。这是因为我采用的照明方式是IBL,主要靠的是FG的光子。而FG的光子也是有反射和折射次数的。

【基础教程】详解在maya中制作玻璃材质

如图打开fg的反射折射次数限制,调高一点点。使光子可以穿透杯壁照亮杯底的地面。

【基础教程】详解在maya中制作玻璃材质

得到的结果。

【基础教程】详解在maya中制作玻璃材质

最后,增加了地面纹理,加强了Hdr的强度,加强照明,细微调节了材质属性。

blinn材质的玻璃。

【基础教程】详解在maya中制作玻璃材质

也可以在插入transparencyramp上面添加一些颜色来制作有玻璃,但你不要太期待结果。

【基础教程】详解在maya中制作玻璃材质

还可以给玻璃增加一点折射模糊,让cg味少一点。

【基础教程】详解在maya中制作玻璃材质

折射模糊在材质的mental ray标签下,Mi Refraction Blur就是了,limit是折射模糊的次数,rays是精度。

【基础教程】详解在maya中制作玻璃材质

调高blur,毛玻璃。

当然这个属性会让渲染速度大大减缓,慎重使用。

还可以在bump里连入贴图,让玻璃看起来不那么规则。

三、使用mental ray材质制作玻璃:

Mental ray的建筑材质有很多优势,相对于blinn来说有一个巨大的优化就是——内置能量守恒。

这是一条强硬的规则让你无法打破它,即使你的设置是有问题的,但得到的结果其实和你的设置是不同的,而是强制得到一个正确的结果。

当你给材质一个颜色,然后不断调节他的反射率你就明白了。

【基础教程】详解在maya中制作玻璃材质

【基础教程】详解在maya中制作玻璃材质

Mia材质的设置。主要是让0度视角与90度视角的反射率都为1,即不产生菲涅尔反射,默认mia是有菲涅尔反射的。

之后给一个纯红的颜色。并且把反射率给为0。之后的图都是在不改变diffuse的前提下,只调节反射率的值得到的

【基础教程】详解在maya中制作玻璃材质

Reflectivity=0

【基础教程】详解在maya中制作玻璃材质refectivity=0.3

【基础教程】详解在maya中制作玻璃材质

Reflectivity=0.6

【基础教程】详解在maya中制作玻璃材质

Reflectivity=1

简单来说,当你把mia材质的反射开到1,并且关闭了菲涅尔反射的时候,你的diffuse颜色就没用了。想象一下吧,反射为1的材质是啥样的?其实就是镜子,完美反射周围的环境没有自己。这个时候,不论你给他黄色蓝色绿色,都只能看到周围的环境而看不到自己的固有色。

但是maya的基本材质是没有这个功能的,你可以自己动手做试验,maya的材质,diffuserefection得到的结果会向上叠加,而超过极限,得到过曝的结果。这就是很多人用maya的基本材质做东西总觉得很假的其中一个原因了。

并且,对于mia材质,还有这样一个特点,折射覆盖反射覆盖漫反射。如你看到的上面的渲染图,在漫反射固定的情况下,反射属性越高,则漫反射效果则自动降低,到反射为1的时候甚至直接就没有漫反射了,所以说反射覆盖漫反射效果。而折射也有同样的效果,开得越高,则反射效果以及漫反射效果都会越低,就算你给的反射值是1,也会随着折射的强度提高而不断降低。

这就是mia材质的强制能量守恒,让你无法得到不正确的结果。

好的,这些是mia材质的一点点基本知识。

回到制作玻璃上来,首先还是关闭漫反射。然后将reflectivity即反射调为1,折射率调为1.7transparency调为1,即全透明,打开brdf卷闸栏,勾选use fresnel reflection,这个选项会让折射率来控制菲涅尔反射。前文已经阐述过。然后,反射和折射之间的能量守恒,mia材质会自动为你处理,不用担心,这个材质就算设置好了。

【基础教程】详解在maya中制作玻璃材质

得到的结果。非常快速而且效果很棒。

另外,你可能一直注意到,玻璃内壁似乎挺明显的样子。Maya基本材质的时候对这个问题是没办法的。但是对于mia材质,你可以把advanced reflection卷闸栏下的skip reflection on inside的勾给去掉。会得到内壁不那么清晰的结果。

【基础教程】详解在maya中制作玻璃材质

这个选项勾选的意思是忽略内壁反射,取消勾选的意思是计算内壁反射,意思就是,不光计算法线朝上的那一面的反射,还要计算面的另一边的反射。其实我一直在想这个是不是搞反了啊,但后来发现这个可能和一个叫做TIRtotal internal reflection)的东西有关。这个我个人还没完全弄明白,但知道可通过这个方法得到不错的效果。

Mental ray材质做玻璃还有个要在意的地方就是玻璃颜色。有点像vray的雾颜色。

mia材质中,主要是使用advanced refraction卷闸栏下的属性来操控颜色。

勾选上use max distanceuse color at max distance

Use color at max distance的颜色设置可以理解为你要设置的玻璃的颜色,max distance下面的数值则是说,光线进入介质开始,传播了多远的距离会变成你选中的颜色。你可以根据你的场景的大小来设置这个数值。Maya默认的单位是cm,每一个单元格就是一厘米,如果你自己没有乱调的话。你可以估算一下你的杯壁大约是多厚,大概传播多远的距离变成你要的颜色比较好。

总的来说,max distance越大,则玻璃颜色越淡,max distance越小,则玻璃颜色越深。这个是很容易理解的。而且,你会发现,使用advanced refraction下面的属性来控制玻璃颜色比你直接用transparency直接控制颜色的优势:颜色并不是均匀地分布在玻璃的每一寸表面上,而是越厚的地方,颜色越深,越薄的地方颜色越浅,这都得益于max distance。很简单的道理,想想就明白了的。

【基础教程】详解在maya中制作玻璃材质

很微妙的玻璃颜色。

关于mia材质设置反射模糊或者折射模糊的方法在这里就不再赘述了,有很多地方可以查到资料。

四、玻璃的阴影以及焦散:

关于玻璃的阴影首先第一点要明确的是:玻璃的阴影是实心不透明的!

上图。

【基础教程】详解在maya中制作玻璃材质

【基础教程】详解在maya中制作玻璃材质

这是客观世界的真实结果,玻璃的阴影就是实心不透明的。

而软件里把玻璃阴影调成半透明的做法,其实只是一种接近真实的欺诈,但绝对谈不上真实。真正的玻璃阴影其实是实心的阴影加上焦散。

先说blinn材质,我个人是不知道如何让他的阴影变成实心,似乎只要是给它开了透明,它的阴影就开始变得透明起来。并且有个数值可以调整这个阴影的透明程度。

raytracing options下面的shadow attenuation,值越小,阴影越透明,值越大,阴影越不透明。

有一点十分值得注意的是,这个数值默认是0.5,会造成透明贴图的阴影并不透明。把这个数值调为0,或者把quality标签下的shadow method 改成segments就可以解决这个问题。

相信有人被这个问题困扰过。

另外,你不要去关注上面两个属性light absorbancesurface thikness,这两个数值意思是灯光吸收量和表面厚度,只有在software渲染器里才能好好工作。就算好好工作效果也很不好。

【基础教程】详解在maya中制作玻璃材质

shadow attenuation=0

【基础教程】详解在maya中制作玻璃材质

shadow attenuation=0.5

【基础教程】详解在maya中制作玻璃材质

shadow attenuation=1

一般用blinn材质的话,能得到的阴影效果大体就是这种程度的。你会发现能够在阴影上看到明显的杯壁,这个时候你可以给灯光的阴影加一点点模糊来遮蔽这些视觉效果(这里的所有图已经给了阴影一点点的模糊,如果不给的话会非常非常硬),基本上得到的效果还是可以接受的。特别是当光源很散,阴影并不像这个例子里直接用聚光灯打出来的话,很可能根本就看不出来的。(在之前的例子里一直是看不到阴影的,因为光源来自四面八方,阴影并不明确)

现在我们回到mia材质上来。它当然也可以使用类似于blinn的这种阴影计算方式,特别需要注意的一点是,当你使用这种简单的阴影计算方法,并且使用了max distance时。你的shadow method必须为segments才能得到正确的阴影效果。

【基础教程】详解在maya中制作玻璃材质

Shadow method=simple

【基础教程】详解在maya中制作玻璃材质

Shadow method=segments

虽然在这个例子中区别非常微妙。但是在某些复杂的相互交错的场景中,会有致命的差别。我暂时举不出特别好的例子,只是建议大家尽量使用segaments阴影模式。

现在说明真正贴近自然的玻璃阴影制作方法,首先是使用mia材质,然后在advanced refraction卷闸栏下面的refractive caustictransparent shadow两个选项。默认是勾选后者的,就是简单的透明阴影,而我们想要使用焦散阴影,于是勾选前者。Caustic就是焦散了。

这个时候你渲染还看不到任何区别。只有当你勾选上渲染心里的caustic以及灯光上的发射光子,才会有效果。

【基础教程】详解在maya中制作玻璃材质

好的,实心的阴影已经出现了,并且有一些微弱的焦散效果,对光子等等进行一系列调节,来加强焦散效果。

【基础教程】详解在maya中制作玻璃材质

好的。这样就得到了不错的焦散效果。由于模型本身的限制,焦散的形状并不是特别好看。大家可以拿更好的模型来做做看。焦散的调节是很简单的,教程也好找。我就不说了。

有什么不明白的,欢迎留言提问。