ETH官方钱包

切換
舊版
前往
大廳
主題

Bokeh(2)

Lumi | 2017-07-28 22:06:50 | 巴幣 4 | 人氣 328

由於對(duì)上一篇的結(jié)果還是不怎麼滿意,就在認(rèn)真考慮實(shí)作Scatter法的時(shí)候找到了CryENGINE 3 決勝時(shí)刻:先進(jìn)戰(zhàn)爭的投影片,這才發(fā)現(xiàn)Bokeh特效的眉角數(shù)一數(shù)二的多,對(duì)於Gather法還有許多改善的技巧可以用。上回的Bokeh實(shí)作只有三個(gè)步驟,這回增加到七個(gè),複雜程度不只倍增,差點(diǎn)生不出來。不過還是照慣例只簡單敘述新的處理步驟:

1. 計(jì)算CoC
在儲(chǔ)存CoC用的texture中,增加了儲(chǔ)存光線擴(kuò)散後的衰減程度。

2. Downsampling
Physically based rendering會(huì)在極端角度下反射回能量極高的光線,造成物體邊緣的某幾顆像素特別亮,攝影機(jī)可能只需移動(dòng)不到一個(gè)像素寬就能造成像素閃爍。而Bokeh計(jì)算需要將原始的HDR圖片縮小成1/4大小,移動(dòng)攝影機(jī)時(shí)同樣也容易造成閃爍。尤其Bokeh效果會(huì)把原本細(xì)小的亮處擴(kuò)大,使得閃爍非常明顯。

▲攝影機(jī)只是稍微退後,某些亮處就改變了

由上圖可以看出,模糊範(fàn)圍比起上回的實(shí)作還要大許多,這也使得閃爍明顯到讓人很煩躁,因此這回特別加了downsampling步驟。為了計(jì)算1/4 texture中的每個(gè)像素,得對(duì)原始圖片做13次採樣。另外在縮小CoC texture時(shí),為了避免瑕疵而選擇半徑最大的像素。



▲改善後Bokeh的結(jié)果相當(dāng)穩(wěn)定

3. Tile CoC
將CoC以20x20像素為單位切割成許多Tile,找出Tile中最小與最大的CoC,計(jì)算結(jié)果會(huì)用於下個(gè)步驟決定採樣的半徑。在CryEngine與先進(jìn)戰(zhàn)爭的投影片中雖然只有簡單敘述,但要讓最後的畫面不會(huì)看到一塊一塊的Tile還得下許多功夫。

4. Main Pass
上回的採樣點(diǎn)座標(biāo)是先用C++計(jì)算出來,將座標(biāo)寫死在shader內(nèi),這回改成在shader內(nèi)即時(shí)計(jì)算。使用同心圓式7x7次的採樣,但修改演算法使採樣形狀變成六邊形,光圈值離f/8越遠(yuǎn)越接近圓形,同時(shí)形狀會(huì)稍微旋轉(zhuǎn)。
▲從上到下依序?yàn)閒/8、f/4、f/2

另外加了些上回沒考慮到的要素,光線擴(kuò)散後的能量會(huì)隨著CoC的半徑衰減,靠近攝影機(jī)的物體較能遮蔽遠(yuǎn)處的物體,還有背景重建(background reconstruction)。另外把前景與背景都輸出到同一張圖上,降低一點(diǎn)記憶體用量。

▲無背景重建,只計(jì)算比目前像素還靠近攝影機(jī)的採樣點(diǎn)

▲加入背景重建

5. Prefilter
6. Median filter
步驟5和6是作為取代上回的LOD法的對(duì)策,上回對(duì)main pass生出的1 / 4大小texture做mipmap,使用更低解析度的像素只會(huì)讓畫面品質(zhì)降低,而且採樣半徑越大就得用越低的解析度來彌補(bǔ)採樣數(shù)不足的問題。這回增加的prefilter步驟會(huì)做一次3x3採樣的模糊,接著的median filter也是做3x3採樣,但是取中位數(shù)(median),用來填補(bǔ)各採樣點(diǎn)中的空隙。

▲Main pass後若不做任何改善


▲Prefilter + Median filter
7. Combine
增加了Tile CoC之後,前/背景的weight計(jì)算還得考慮採樣半徑大小,才能順利和中景合併。放大Bokeh結(jié)果至視窗大小時(shí)使用了GPU Gems 2的Bicubic Filter,但偶爾還是會(huì)出現(xiàn)惱人的鋸齒。

▲最後結(jié)果


為了改善許多小細(xì)節(jié)的品質(zhì),這Bokeh從原本不便宜的特效變成超昂貴的特效,現(xiàn)在超想換新顯卡...。接下來還想弄反鋸齒,以前的OpenGL程式是用FXAA,但它和PBR不怎麼合。現(xiàn)在最常見的反鋸齒方法又超複雜的,搞不好下一篇又要難產(chǎn)了。

創(chuàng)作回應(yīng)

更多創(chuàng)作