講解Ambient Occlution的原理與高級應(yīng)用(4)
導(dǎo)言:
Ambient occlusion也就是大家熟知的環(huán)境遮擋,簡單點說,就是一個取樣點上被其他幾何體覆蓋的程度,它是被通常用來模擬全局光照效果的簡單方法。
下面教程開始
環(huán)境遮擋的原理
基本的原理跟final gather類似,其取樣點的生成是一樣的。
首先從攝像機發(fā)出取樣光線,取樣光線和物體的交點,就是我們說的取樣點,然后從取樣點發(fā)出次光線(probe rays)。
接著Ambient occlusion和fg就不一樣了。Ambient occlusion的次光線是每一條光線是否被周圍的物體所遮擋,如果遮擋了直接返回值,不做任何的Shader計算,也就是取樣點的周圍被物體阻擋著不讓看到背景的百分比;fg的次光線不太一樣,他的次光線與周圍的物體相交以后,它要求焦點處的顏色值,然后返回的是顏色值,而不是Ambient occlusion的真假值。
最后也是不一樣的,作為Ambient occlusion,每一個取樣點其實就是渲染時輸出的色彩值,而fg只是為渲染時的fg point,它代表著要渲染點附近的光照,在渲染時用來產(chǎn)生照明。(圖01)
圖01
下面我就結(jié)合MentalRay for Maya,跟大家一起討論一下Ambient occlusion的一些應(yīng)用。MentalRay for Maya中有三個節(jié)點是我們在使用環(huán)境遮擋時需要用到的,mib_amb_occlusion,mib_fg_ occlusion,mib_bent_normal_env,如下圖。(圖02)
圖02
環(huán)境遮擋的使用
在介紹實際的應(yīng)用之前,我們用一個簡單的場景作介紹,場景中只有一盞物理燈。默認(rèn)渲染如圖。(圖03)
圖03
Ambient occlusion(AO)經(jīng)典的環(huán)境遮擋效果,也被稱為漫反射遮擋(Diffuse occlusion),可以用來縮放對材質(zhì)環(huán)境光的貢獻,它一般賦給材質(zhì)的環(huán)境光參數(shù)(Ambient),更進一步說他最好賦給Lambertian材質(zhì)。如下圖。(圖04)
圖04
渲染的效果如下圖。(圖05)
圖05
現(xiàn)在暗部的細節(jié)出來了,可見AO很好的模擬了全局光。
Reflective occlusion發(fā)射沿著反射光線的方向發(fā)射次光線,而不像Ambient occlusion那樣以物體表面的法線方向為中心發(fā)射次光線,下面的示意圖說明了之間的不同。(圖06)
圖06
在MentalRay for Maya中實現(xiàn)起來很簡單,只需要將mib_amb_occlusion節(jié)點參數(shù)中的Inflective打開就行了。(圖07)
圖07
同時我們可以調(diào)整小spread的值為0.1,使得反射遮擋的效果更加明顯,渲染效果如圖。(圖08)
圖08
大家可以很明顯的看到物體的暗部是沿著反射方向產(chǎn)生的。
我們可以給mib_amb_occlusion的bright的參數(shù)連接一個環(huán)境節(jié)點,使得環(huán)境對我們的材質(zhì)有了影響,但這不說明次光線對環(huán)境光進行了采樣計算,它只是把遮擋的結(jié)果與環(huán)境光簡單相乘罷了,連接和渲染結(jié)果如圖。(圖09、圖10)
圖09
圖10
第二種連接方法就是將我們的攝像機連接到環(huán)境球查詢節(jié)點上,然后設(shè)輸出參數(shù)為1(取樣環(huán)境),另外可以選擇occlusion in alpha,如圖。(圖11、圖12)
圖11
圖12
從渲染結(jié)果來看,效果是一樣的,但是他對環(huán)境球取樣的階段是不一樣的。我們可以減小它的spread參數(shù),也就是改變次光線取樣范圍,使得反射更集中,渲染如圖。(圖13)
圖13
mib_fg_ occlusion的使用mib_fg_ occlusion其實就是一個選擇器,也就是說如果在渲染的時候渲染全局中打開了final Gather,我們就用final gather來計算遮擋,反而反之,節(jié)點連接如圖。(圖14、圖15)
圖14
圖15
mib_bent_normal_env的使用在講mib_bent_normal_env之前,我們有必要了解一下mib_amb_occlusion其他的輸出模式(output_mode)。
0是標(biāo)準(zhǔn)的遮擋模式,1是環(huán)境進行取樣模式,2、3就是bent normal模式。所謂bent normal就是計算未遮擋的次光線,求平均值,所得到的就是bent normal的法線矢量,名字很形象。
矢量的三個分量的值分別對應(yīng)紋理的RGB三個值,output Mode的模式2輸出的是世界坐標(biāo)系,模式3輸出的是攝像機坐標(biāo)系。(圖16)
圖16
模式2,世界坐標(biāo)系。(圖17)
圖17
模式3,攝像機坐標(biāo)系。(圖18)
圖18
mib_bent_normal_env其實是為了加速環(huán)境遮擋所制作的一個節(jié)點,在動畫中對于我們場景中的不移動不變形并且沒有別的物體接近一直影響到他的受光物體,我們就可以采用這種方法,所以局限性很大,但是帶來最大的好處就是渲染速度巨大提升,因為我們不用跟蹤任何一條光線。
我們可以預(yù)先將環(huán)境遮擋和bent normal烘焙成紋理文件,我們也可以用lightmap節(jié)點幫我們將文件保存進紋理文件,連接的示意圖如圖。(圖19)
圖19
我們連接的紋理文件(圖中虛線框),一定要把writable選項打開,才能使我們的紋理寫道磁盤文件上,連接圖如下。(圖20)
圖20
烘焙完紋理以后,前期工作就算完成了,就可以用我們的mib_bent_normal_env了。
我們可以這樣理解這個節(jié)點,他的作用跟把烘焙的紋理不但能直接加到物體的材質(zhì)上,而且它可以是相對環(huán)境的反應(yīng),只不過我們要用一張環(huán)境貼圖,而不是真實物體的影響。
這種方法主要是用在實時渲染(realtime rendering),也就是我們說的游戲中,能模擬很好的全局光照。下面是我們烘焙好的兩張圖,一張是環(huán)境遮擋,另一張是bent normal。(圖21、圖22)
圖21
圖22
環(huán)境遮擋
連接方法示意圖。(圖23)
圖23
節(jié)點的實際連接圖。(圖24)
圖24
環(huán)境遮擋的高級應(yīng)用實際應(yīng)用中,將環(huán)境遮擋,單獨渲染成一層,然后再后期是使我們最常用的方法,因為只要我們不追求物理的真實度的話,這種方法是很靈活方便的。
我們在PS中舉個例子。下面是我們渲染的兩個層,一層是color層,另一層就是occ層。(圖25、圖26)
圖25
圖26
在PS里面我們可以把occ層設(shè)為mutiply模式,合成后為下圖。(圖27)
圖27
在MentalRay中,我們可以把Ambient occlusion作為一個Light shader,成為燈光的內(nèi)建環(huán)境遮擋,節(jié)點連接如圖。(圖28)
圖28
渲染如圖。(圖29)
圖29
我們可以分析一下,每個渲染點需要查詢燈光,我們的燈光是環(huán)境遮擋Shader,他會返回這個點的照明強度為這個點的遮擋程度,背離燈光的地方,途中黑色的地方,因為它在燈光的陰影區(qū),也就是說它不會去查詢燈光照明強度的,因此沒辦法調(diào)用環(huán)境遮擋,從而成了黑色。
到此為止,我們的環(huán)境遮擋就講到這里了,感謝大家看我的教程。