查看: 1659|回复: 0
打印 上一主题 下一主题

利用Maya基础材质制作玻璃效果

[复制链接]

9210

主题

1

听众

5万

积分

内部人员

Rank: 7Rank: 7Rank: 7

纳金币
12582
精华
186

活跃会员

跳转到指定楼层
楼主
发表于 2013-9-11 14:39:56 |只看该作者 |倒序浏览
pstatus"> 本帖最后由 lut_456 于 2013-9-11 14:40 编辑


导言:大家好,我是戴巍。今天和大家分享的是如何利用maya基本材质和mental ray材质实现玻璃效果的教程,希望对大家有所帮助。(本文部分图片可右存或复制链接看大图)
本文导读
材质的基本原理
使用Maya基本材质实现玻璃效果
使用Mental ray材质实现玻璃效果
玻璃的阴影以及焦散
材质的基本原理
能量守恒
在光线照射到某个物体表面的时候,总体上会出现三种反应:吸收,反射以及折射。其中反射又分为漫反射和镜面反射。

而所谓的能量守恒法则说的则是,能量不可能凭空产生也不可能凭空消失,只可能发生转换。
用在光线传播过程中则可以得到这样一个公式:入射能量=吸收能量+反射能量+折射能量。其中,吸收的能量一般转换为热能,是我们不需要考虑的部分,将这一部分掠去,得到公式:入射能量>=反射能量+折射能量。其中,反射能量可以分为漫反射和镜面反射,而漫反射在我们cg制作过程中,一般为diffuse,而镜面反射一般为specular,而折射一般为refraction。令入射能量为100%,即为1,则可以得到最终我们可以使用的公式:1>=diffuse+specular+refraction。
所有反射都具有菲涅尔效应

这里直接引用下Mental ray官方帮助文档的图。菲涅尔就是你的视线和你看的面的夹角越垂直,则看到的反射越低;你的视线与你看的面的夹角越接近0度,反射越高。
另外,决定菲涅尔效应的主要是折射率这个属性。当折射率越靠近1的时候,90度视角与0度视角的反射率之间的差别越大,当折射率数值越高的时候,90度视角与0度视角的反射率越接近1。
一般透明物体的折射率在1.3-1.9之间,塑料、橡胶、烤漆也是这个范围左右。金属则是4-10,甚至更高。

使用maya基本材质实现玻璃效果
这里使用大家最熟悉的blinn材质,运用前面讲的基本原理来制作玻璃。
首先是设置场景,对于高反射的金属或者玻璃等物体来说,基本上可以说不存在自身的固有色,这些物体之所以被看见,是因为反射或者折射周围的环境,这时环境对于玻璃的制作来说是万分重要的,没有环境就没有效果。
这个场景使用HDR来进行照明,在Mental ray中则使用IBL节点。
关键设置如下:
开启IBL节点,如果FG没有自动开启,请手动开启。

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

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

渲染得到的结果如下。


给模型一个blinn材质,调节transparency到全透明。在raytracing option标签下开启折射refraction,将折射率调节到1.7或者类似的一个数值,得到下图这样的结果。

这是因为反射折射次数在默认情况下都设置得非常小。为了讲解反射和折射次数,我做了一个简单的场景来说明。

两面相对的镜子,中间有个小球。镜子给的是高反射的材质。


按照我们的生活经验,两面相向而立的镜子应该是无限次反射才对。但是在软件渲染出来的图中却看到,从一面镜子里面只能看到对面的镜子和小球,对面镜子里的反射是没有的,反观另一面镜子也不会有反射。其实这两面镜子我给了同样的材质,那问题在哪里呢,就在反射与折射次数的限制。
当我们在渲染的时候,如果遇到像我现在使用的这个案例,计算机要是按照生活里的经验去计算,那么就要无限地计算两面镜子之间的反射,渲染便永远不会终止。为了避免这种情况的产生,软件中引入了反射与折射次数限制来提高性能。这个限制是由两部分构成的:全局设置以及单个材质的设置。当你打开Mental ray的quality标签,下面有个raytracing、reflection和refraction的值则分别对应会计算的反射和折射次数,而max trace depth则是这两个值相加的最大限制。比如两个值都设为10,但是max trace depth也设为10,那么折射和反射次数则不会达到20,而是不会超过10。
在高反射的场景里,一般会设置为10,10,20。但是渲染了以后,你会发现结果没有变化,那是因为虽然你把全局设置改变了,但单个材质下面也是有限制的。

找到这个blinn球的raytrace option,下面有一个reflection limit,这个也是反射次数限制。下图分别为大家演示了reflectionlimit值为0,1,2,3,4,5时的结果,你会发现这个数值设为几,那么反射就会进行几次。








折射也是一样的道理,折射一般要9次以上,而blinn材质的折射次数,默认就是9次。反射也要有3-5次左右,将场景里所有的反射折射次数都调高吧。记得当你调高这些数值的时候,渲染时间也会随之而大幅度增加。回头看那张玻璃杯的图,调节了反射折射次数以后的结果是,黑的地方消失了,不过反射折射还不好看。

要怎么补救呢?首先根据开篇说的能量守恒法则1>=diffuse+specular+refraction,对于玻璃物体来说,是不存在漫反射的,有的都是镜面反射和折射。所以,先把color或者diffuse关掉,调成0,或者关掉。其次,玻璃是一个遵循菲涅尔反射的高反射物体。我们把反射率和specular color调到最高。在blinn材质中对于反射的控制是reflectivity和specular color共同控制的,只有二者皆为1的时候,才是全反射,任意一个值不为1,都会相应降低反射率,任意一个值为0,则反射率就是0。
然后将specular roll off调节为0或者接近0。绝大多数人理解这个值为高光强度,这个理解是有偏颇的。这个值真正的作用其实是控制菲涅尔效应的。当该值为1的时候,90度视角与0度视角的反射率皆为specular color与reflection的乘积(90度视角与0度视角参见菲涅尔反射;乘积的原因是这两个数值共同控制真正的折射率);当该值为0时,0度视角的反射率为specular color与reflectivity的乘积,而90度视角的反射率为0。
所以,这个值可以取代sampler info与ramp节点来实现对菲涅尔的控制。(不相信的同学可以自己弄一个圆球,把这个值调到0,你会发现球体的边缘照样有反射,并且越靠近你的垂直视线,反射越低。)

上图是将specular roll off调节到0所得到的渲染结果,即有了菲涅尔反射的结果。你会发现杯子正垂直于你视线的面上的反射几乎已经看不到了,而同你的视线夹角非常小的面,依然有着很高的反射。
另外,在我这个案例中eccentricity这个值不产生作用。一般来说,这个值被翻译成偏心率,控制的是高光的大小。但是这里所谓的高光,其实是三维软件虚拟出来的一个东西,因为你用了虚假的灯光,虚假的灯光照射在虚假的材质上面,会形成虚假的高光。但是你要按照我说的一步步地做,你会发现这时候调整这个数值不起任何改变。
这是因为我没有使用虚假灯光,这个场景里唯一的默认灯光在开始时已经被我关闭了,并且没有新建任何灯光,起到照明作用的是一张hdr贴图,以及FG的计算。所有玻璃上能看到的高亮部分,并不是计算机通过虚假灯光位置计算出来的所谓高光,而是根据光线跟踪计算出来的真正的反射。这一部分我没办法更深入地说明了,这不是这篇教程里想要解决的问题,只是附带提一下,如果想不明白也不要深究,很多人都不知道这些但依然做出很棒的作品,条条大道通罗马嘛。

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

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

可以看出,杯子的边缘,也就是接近0度视角的地方是黑的;接近中心,也就是接近90度视角的地方是白的。也就是说,这套节点可以控制不同视角的地方获得不同的值。
现在的反射值是在0度视角也就是边缘的地方比较强,而90度视角,也就是中间地方很弱。为了满足能量守恒,得插入一个相反的结果到transparency通道中去,也就是让越靠近边缘的地方,透明度越低,而越靠近中心的地方,透明度越高。
刚才做的这套节点刚好合适,插入到之前blinn材质的transparency通道中去。

得到的结果,感觉太黑了点,这个时候可以控制一下ramp上的颜色来调节到可以接受的结果。有人可能会说,如果这个时候调ramp上的黑白颜色,那么不是打破了能量守恒了吗?其实你用blinn材质做玻璃,根本无法精确控制能量守恒,可能你能让标准的90度视角与0度视角获得正确的结果,但中间过渡的环节你并不知道过渡到底该是线性的还是曲线的还是咋样的。其实菲涅尔现象的数值变化本身就很复杂,即不是线性,也不符合单一曲线,最精确的控制方法是输入折射率来控制菲涅尔,前文已经提到菲涅尔现象最主要是受到折射率的控制,这是一种物理属性。而在Maya自带的简单blinn模型中,是无法实现用折射率精确控制菲涅尔现象的,更精确的方法将在后文提到。
顺便说一下,Maya的blinn材质给人的感觉挺奇怪,尤其是反射是由specular color与refectivity两个数值共同控制,我觉得这些特性早就应该淘汰了。新版本的Maya从来不更新这些过时的东西,导致Maya这个软件已经显得有点尾大不掉,学习起来会相对困难一些。

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

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

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


得到结果如下图。

最后,增加了地面纹理,加强HDR的强度,加强照明,细微调节材质属性,得到下面这个纯blinn材质的玻璃。

也可以在插入transparency的ramp上面添加一些颜色来制作有色玻璃,但你不要太期待结果。还可以给玻璃增加一点折射模糊,让CG味少一点。


折射模糊请选择材质的Mental ray标签下的Mi Refraction Blur,limit是折射模糊的次数,rays是精度。

调高blur,制造毛玻璃的效果。当然这个属性会让渲染速度大大减缓,请慎重使用。

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


使用Mental ray材质制作玻璃
Mental ray的建筑材质有很多优势,相对于blinn来说有一个巨大的优化就是——内置能量守恒。这是一条强硬的规则让你无法打破它,即使你的设置是有问题的,但得到的结果仍旧是一个强制得到的正确结果,和你的设置其实是不同的。当你给材质一个颜色,然后不断调节它的反射率你就明白了。

Mia材质的设置主要是让0度视角与90度视角的反射率都为1,即不产生菲涅尔反射,默认mia是有菲涅尔反射的。再给一个纯红的颜色,并且把反射率给为0。之后的图都是在不改变diffuse的前提下,只调节反射率的值得到的。以下分别是Reflectivity=0,0.3,0.6和1时的效果。





简单来说,当你把mia材质的反射开到1,并且关闭了菲涅尔反射的时候,你的diffuse颜色就没用了。想象一下吧,反射为1的材质是啥样的?其实就是镜子,完美反射周围的环境而没有自己。这个时候,不论你给它黄色蓝色绿色,都只能看到周围的环境而看不到自己的固有色。
但是Maya的基本材质是没有这个功能的,你可以自己动手做试验,Maya材质diffuse和refection得到的结果会向上叠加,最终会超过极限得到过曝的结果,这就是很多人用Maya的基本材质做东西总觉得很假的原因之一。
而且mia材质还有这样一个特点,就是折射覆盖反射覆盖漫反射。像上面的渲染图,在漫反射固定的情况下,反射属性越高,漫反射效果会自动降低,到反射为1的时候甚至直接就没有漫反射了,所以说反射覆盖漫反射效果。折射也有同样的效果,开得越高,则反射效果以及漫反射效果都会越低,就算你给的反射值是1,也会随着折射的强度提高而不断降低。
这就是mia材质的强制能量守恒,让你无法得到不正确的结果。

好的,这些是mia材质的一点点基本知识,我们再回到制作玻璃上来。首先还是关闭漫反射。然后将reflectivity即反射调为1,折射率调为1.7,transparency调为1,即全透明,打开brdf卷闸栏,勾选use fresnel reflection,这个选项会让折射率来控制菲涅尔反射,前文已经阐述过。不用担心反射和折射之间的能量守恒,mia材质会自动为你处理,这时这个材质就算设置好了。得到的结果如下,非常快速而且效果很棒。

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

这个选项勾选的意思是忽略内壁反射,取消勾选的意思是计算内壁反射。意思就是,不光计算法线朝上的那一面的反射,还要计算面的另一边的反射。其实我一直在想这个是不是搞反了,但后来发现这个可能和一个叫做TIR(total internal reflection)的东西有关。这个我个人还没完全弄明白,但我们仍然可以通过这个方法得到不错的效果。
Mental ray材质做玻璃还有个要在意的地方就是玻璃颜色,这有点像vray的雾颜色。在mia材质中,主要是使用advanced refraction卷闸栏下的属性来操控颜色。
勾选上use max distance和use color at max distance。Use color at max distance的颜色设置可以理解为你要设置的玻璃的颜色,max distance下面的数值则是说,光线进入介质开始,传播了多远的距离会变成你选中的颜色。你可以根据场景的大小来设置这个数值。Maya默认的单位是cm,每一个单元格就是一厘米,如果你自己没有乱调的话。你可以估算一下你的杯壁大约是多厚,大概传播多远的距离变成你要的颜色比较好。
总的来说,max distance越大,则玻璃颜色越淡,max distance越小,则玻璃颜色越深,这个是很容易理解的。而且,你会发现使用advanced refraction下面的属性来控制玻璃颜色比你直接用transparency直接控制颜色的优势:颜色并不是均匀地分布在玻璃的每一寸表面上,而是越厚的地方,颜色越深,越薄的地方颜色越浅,这都得益于max distance。
最后我们得到了下面这种效果,很微妙的玻璃颜色。

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

玻璃的阴影以及焦散
关于玻璃的阴影首先第一点要明确的是:玻璃的阴影是实心不透明的!这是客观世界的真实结果。而软件里把玻璃阴影调成半透明的做法,其实是一种接近真实的欺诈,但绝对谈不上真实,真正的玻璃阴影其实是实心的阴影加上焦散。



先说blinn材质,我个人是不知道如何让它的阴影变成实心,似乎只要是给它开了透明,它的阴影就开始变得透明起来,并且有个数值可以调整这个阴影的透明程度。
在raytracing options下面的shadow attenuation,值越小,阴影越透明,值越大,阴影越不透明。有一点十分值得注意的是,这个数值默认是0.5,会造成透明贴图的阴影并不透明。把这个数值调为0,或者把quality标签下的shadow method 改成segments就可以解决这个问题。相信有人被这个问题困扰过。
另外,你不要去关注上面两个属性light absorbance和surface thikness,这两个数值意思是灯光吸收量和表面厚度,只有在software渲染器里才能好好工作。就算好好工作效果也很不好,以下各图分别是shadow attenuation=0,0.5和1时的效果。



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

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


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

现在说明真正贴近自然的玻璃阴影制作方法,首先是使用mia材质,然后注意advanced refraction卷闸栏下面的refractive caustic与transparent shadow两个选项。默认是勾选后者的,就是简单的透明阴影,而我们想要使用焦散阴影,于是勾选前者。Caustic就是焦散了。
这个时候你渲染还看不到任何区别。只有当你勾选上渲染心里的caustic以及灯光上的发射光子,才会有效果。

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

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

分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-14 15:46 , Processed in 0.103317 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部