天天看點

手機上Bloom效果trick

這篇不講具體bloom本身的算法,講的是如何獲得需要bloom的亮部顔色資訊。

這年頭手機上很多3D arpg/mmorpg都在進階效果中加入bloom了,因為好看嘛。不過絕大部分遊戲的bloom效果都是那種全屏大部分地方都泛光,造成整個畫面過曝以及模糊,雖然這種效果應用在偏向卡通渲染的畫面上看起來還是挺不錯的,而且也符合國人喜歡的“特效就是要亮瞎人狗眼”的畫風,咳咳。。。但是這種東西在相對寫實的畫面上面效果并不好。

造成這種結果的原因也很簡單,就是沒使用HDR,也就是說迫不得已必須将bloom的門檻值設到低于1.0的程度,這樣自然畫面很多地方都會被bloom了,尤其是臉部,亮度本身就會很高,很容易被bloom了,細節全無。

解決方法: 一種方法就是讓不該bloom的地方不要bloom,比如說我隻需要主角的裝備bloom,而臉部,頭發,場景等都不需要bloom,這樣的話會大幅度減少bloom的地方,畫面效果好很多,具體方法可以使用stencil buffer來做,想要bloom的mesh給寫一個值進去,最後bloom的時候值不對直接fail。

第二種方法效果會更好一些,但是也更費一些。畢竟上面的方法bloom的門檻值還是比較低,需要美術同學做精心的調教才能達到好的效果,最好的方法還是有HDR才行。 因為手機上不好用HDR(當然,這年頭高端手機開HDR已經沒有問題了,比如UE4引擎已經幫忙搞定HDR的問題了,包括在一些不支援真HDR的手機上,引擎也做了另外的方案儲存HDR資訊),可以考慮将HDR的資訊單獨儲存起來,方法是将計算好的color的亮度摘出來,然後取對數(用來減小範圍),最後将這個亮度資訊儲存到alpha通道上,最後在bloom的時候,将這個亮度資訊再decode出來,這樣就相當于有HDR了。這種RGBE的存儲方案已經運用到了多種地方,比如光照圖來存HDR資訊等等。 當然,這個可能需要額外的rendertarget,以及額外的pass來渲染。比如,隻有主角有bloom的話,可以将主角再渲染一遍,最後存儲到另外的rt上,鎮魔曲手遊使用的就是這個方法,也可以考慮使用multiple rt,這樣隻需要渲染一遍就行。