Unity 關於仿崩壞3部分Bloom(部分泛光)效果實現原理(附源碼)

之前寫每個物體的材質球控制屏幕bloom效果,由於性能問題,換了另外一種實現方式

部分泛光的功能,這個是之前寫的,不過性能不行,如果簡單的遊戲還可以,如果大場景的話就不行了

 

原理分析

我這邊就研究崩壞3編譯過的源碼,下面是分析崩壞bloom效果實現

1.我看崩壞編譯過的源碼基本所有shader都會有一個_BloomFactor,這個用於控制泛光強度,用於存儲輸入屏幕那張圖的alpha通道上

2.泛光強弱圖:通過source的rendertexture的alpha乘以source的RGB,就得到一張泛光強弱圖

3.泛光圖:根據泛光的亮度閾值來獲取一張那些地方需要發光的圖

4.泛光圖模糊:按照泛光圖4個大小依次遞半的(1/4,1/8,1/16,1/32)尺寸的rendertexture來進行高斯模糊,得到的四張圖進行疊加

5.最終效果圖:原圖+泛光模糊圖

PS:最近遇到一個問題就是點光源(頂點模式除外),影響rendertexture的alpha通道(會使alpha通道變大)

之前的方案是alpha值越大就越亮,加了點光源,本來暗的東西都變亮,所以爲了解決點光源問題,我們就反過來寫,alpha值爲1就沒有bloom效果,就是alpha越小就越亮,mask圖就是越黑越亮

讓我突然想起之前抓取崩壞的渲染,一張白色爲主的mask圖,才明白人家做成這樣是有他道理,我自己搞從黑色開始的mask圖

最終方案:存儲的alpha值越小,bloom效果越強烈

實現難點

2,3,4都比較容易,百度一下就有

關於存儲alpha

1.對於Geometry渲染隊列的直接在shader輸入顏色的alpha直接修改就可以

standard存儲alpha值

surface shader存儲alpha值

2.對於半透的渲染物體來說(特效)因爲輸出本來就帶alpha值,這個需要我們加一個pass來存儲alpha值

第一個pass需要加ColorMask RGB(避免影響alpha存儲)

第二個pass需要加ColorMask A(避免影響第一個pass輸出顏色)

粒子shader alpha通道存儲

(對於粒子系統,如果不用bloom效果就不要用改過可以存儲alpha通道的shader,直接用原來沒加alpha存儲的版本

因爲粒子系統,有兩個pass的情況,相同材質球不能合併drawcall)

 

因爲我看崩壞那些特效源碼都是用兩個pass,所以反推是這樣用的,在實際項目中確實有效,不過多了pass,不過比之前那個方案渲染多一份來得快得多

 

下面是輸出屏幕的圖source的alpha通道

下面是舊版的圖,我就懶得更新,正常顏色應該和下圖相反

這圖可以在framedebug裏面看到,選中alpha通道就可以

下面是優化過的bloom和扭曲效果

下面是提取出來的demo

鏈接:https://pan.baidu.com/s/1q4OcQlAFF5Zjm480pwdpPw 
提取碼:zahv 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章