Loading
1

[vfxinfo 独家] MentalRay创始人ZAP谈AmbientOcclusion(AO)

文章一部分是转载在Hammer Chen的Blog(本文获得Hammer的转载许可),一部分是自己的使用心得 感谢Hammer无私的让我们转载他的文章,感谢!!!

Hammer的原始文章链接 http://hammerbchen.blogspot.com/2012/10/zapambient-occlusion-ao.html

Master Zap(博客名,个人资料请参阅wiki)何许人也??? MentalRay的作者之一...牛逼哄哄!!! FXPHD曾经出过一套 MRY201 关于材质跟灯光渲染的教程,主讲就是此人,并邀请了好几位业内大神参与视频录制.

附上作者Blog http://mentalraytips.blogspot.tw/

最近我常常遇到有人问在mental ray裡面要怎样使用环境光(ambient light), 大部分的人对 mia_material (Arch & Design)缺乏ambient这个选项感到困惑.这里我试着解释一下

导读: 环境光与Occlusion
很久很久以前…
传统的电脑绘图, 完全没有任何的间接照明, 预设的效果像这样: 打了一盏方向光

整个阴影是全黑的, 一点也不写实, 你甚至看不到这张黄色桌子底下的四隻脚!

因此, 开始有人引进一些小技巧, 其中一个很丑, 不写实的技巧是阴影密度(shadow density) 这个参数的意思是, 光线在阴影的地方, 只有x%的亮的光线会完全不见. 因此你也会找到像"Shadow Color" 与 "Shadow Density"的参数, 你也知道这个东西很荒谬, 一点也不合理!!

一个不透明的物件不是完全遮蔽住光线, 要不然就是让光线透过去, 它不会随机地让光线穿透, 所以遮蔽47%的光线, 这种事情根本不可能, 除非是透明的物体要不然根本不会发生!

规则一: 不管怎样都绝对不要用"shadow color" 或 "shadow density"这两个参数

进入环境光(Ambient)的阶段
但是, 这些早期CG界的人说, 在户外, 因為太阳光的关係阴影会带有一点点蓝色, 难道我不应该把shadow density调小, 把color调蓝, 得到偏蓝的阴影吗?

不行!

阴影之所以会是蓝色, 是因為有天空这个蓝色的补光的关係.
而早期的CG开发人员了解这点, 所以除了发明了"shadow color",这种东西以外 还引进了也一样可怕的东西: Ambient Light

问题是, Ambient Light会產生平均的照明, 这完全不写实效果也很难令人满意. 就像这样:

这跟之前的版本一样可怕. 当然, 你在阴影裡面会看到一些效果, 但那样的效果是很均匀地分布. 现在桌脚可以见到, 但整个顏色完全没有细节!

你看得出桌脚是圆的, 平的或是椭圆的, 桌脚有无碰到地面, 或是悬空的? 紫色的茶壶看起来好像飞起来了, 因為后面的绿色茶壶的阴影没有亮度变化.

这边的问题是灯光打到每个点的时候是均匀的照明, 不管物体的位置或是角度. 但如果我们想要模拟带点蓝色的天空光, 在光源前面的物体会接受到较多的光线, 而在后面(被挡住)的物体光线就会被遮蔽掉.

进入遮蔽(Occlusion)的阶段:
幸运的是, 2002年在ILM有群聪明人, 当他们在做电影<<珍珠港>>的项目的时候, 发明了(他们是用mental ray, 必须强调一下), 叫做Ambient Occlusion (AO)的东西. 基本上, 他们写了个shader,  能找到特定的点被遮蔽的程度, 也就是在那个点上面, 有多少程度遮蔽住光线, 这个遮蔽效果, 看起来像这样:

结合了环境(Ambient) 与 遮蔽(Occusion)

如果你把这个遮蔽(Occusion)效果跟环境(Ambient)结合在一起, 就会得到以下美丽的图片:

你看细节如何美妙地表现出来, 桌脚现在能正确的显示出与地板的接触感, 桌脚的形状也能看出来. 两个茶壶之间也能正确的显示阴暗面 ,茶壶也有很棒的接触阴影. 这就是AO正确的使用效果!

错误地使用 AO!
然而, 很不幸地, 很多人读了却也误解了ILM原始对AO的文件. 他们把AO直接套用到整个场景上面, 这是错的!!!

例如, 有些人会算图, 產生occlusion pass, 然后把两张用叠加的方式合成在一起:


请注意看, 结果会有种脏脏的感觉, 因為occlusion pass是套用在整张图上面, 影响了环境光(ambient)也同时影响了方向光.

这完全没有道理! 方向光的遮蔽(occlusion)本来就已经有计算了, 这也是為什麼方向光会產生阴影. 环境光的遮蔽(Ambient occlusion)之所以会这麼称呼不是没有原因的! 这个功能本来就是要把环境光遮蔽掉, 而不是把方向光遮蔽掉.

但是你在上图看到的是前景的物体把地板弄黑了, 让它看起来脏脏的, 还有, 壶嘴的地方也有脏脏的阴影…等等问题.

所以, 整体的套用遮蔽(occlusion)在beauty pass (包含了 reflections, direct light, 等) 是大错特错的!不要这样做.

好, 我们之前是用环境光与遮蔽的方法, 模拟出写实环境光效果, 以及光线反弹的感觉. 现在我们真的去计算光线的反弹 (採用Final Gathering) 看看效果:

上图是利用3ds Max "Skylight" 与FG算出来的效果. 跟我们前面用环境光+遮蔽產生的效果效果类似, 但是后者是真正的反弹光线.

这也引发了疑问, 既然这麼容易就產生真正的反弹光, 為什麼还要用造假的方式(AO) 合成呢?
以下做回答:
FG是一种内插的技术, 这表示间接照明是经过採样计算出来的, 这些数值会被内差计算. 但是, 如果你算的是动画, 每个frame之间的效果会有不同. 理论上不会只是一个像素的差异, 而是几个区域的像素差异 (这些受到FG 採样点内插所影响的像素)

结果是, 最终的动画会產生闪烁的问题. 你会察觉到, 因為这个闪烁是超过一颗像素大小的, 闪烁会让视觉画面不讨喜.

实际在操作的时候, 我们要结合使用真实的反弹(FG)与造假的(AO合成)的方式来制作

上图说明了, 叁个pass ( Ambient, Direct, Occlusion)用不同的顺序来合成, 產生不同的效果.

第一种方式是错误的做法: 把Ambient + Direct 再叠上Occlusion, 看起会有脏脏的感觉

第二种方式是正确的: 把Ambient + Occlusion (这也就是AO名称的由来) 最后才叠上Direct的pass, 就可以得到很漂亮的效果.