好一陣子都在寫些和特效無關的部分,比方說用script建立render pipeline、支援圖片存檔之類的。最近挑戰了以前嫌麻煩而一直沒去學的compute shader,實作後才發現compute shader程式與相關設定都比繪圖用的shader簡單很多,只不過和現有的render pipeline整合得花點功夫。
整合完成後馬上移植產生ambient BRDF資料的程式,從linux上的C++改成compute shader。執行速度不知快了多少倍,莫名有種爽快感。接著挑戰生成light probe,為了避免出現難看的鋸齒,radiance資料存成512x512x6大小的cubemap,irradiance資料不需要那麼大,姑且先存成32x32x6試試看。使用cmftstudio來檢查radiance的計算結果發現...
▲當mip level很大時,cubemap內每個面的邊緣會出現醜陋的接縫
這個接縫也是個老問題了,以前許多人都是用AMD Cubemapgen來生成light probe,直接使用cubemapgen的去接縫功能。這回可沒辦法靠別人了,研究了cubemapGen的解法後,實作了其中的Warp edge fixup後結果如下:
▲Warp edge fixup
雖然接縫比未實作前改善許多,但也只是變得比較平滑,還是看得到cubemap的邊緣位在何處。無可奈何下加上了Modified Texture Lookup,雖然必須在著色時花費許多指令去調整貼圖座標,不過效果挺不賴的。
▲Warp edge fixup + Modified Texture Lookup
最後將材質用的資料改成目前PBR常用的Albedo、Reflectance、Smoothness與Metallic等數值。下圖紅線以左為非金屬,右方為金屬,越靠前的球Reflectance值越高,越右邊的球Smoothness值越高。
▲球球家族大合照。右後方的球因為沒散射也幾乎不反光,
所以呈現黑色,現實中應該是沒有這種金屬。
實作上圖中出現的bloom效果也使用了compute shader,一口氣對所有mipmap做blur,對X與Y方向總共執行兩次就做完了。雖然看起來大部分post process都可以直接用compute shader完成,而且在AMD顯卡上還可以與繪圖指令同時執行(ACE)。不過根據FF零式HD最佳化篇,大部分情況使用fragment shader比較快。
看起來事情都搞定了,突然很想知道要是甚麼接縫處理都沒做,畫出來會長怎樣。結果發生可怕的事情...
▲甚麼接縫處理都沒做...但是卻看不到接縫...
Vulkan內建無縫處理,我也只能說Vulkan好棒棒了...OTL