人類對畫質的追求總是無止境的,最近正好在學習A站大佬Adrian Mendez分享的Unity Urp原神卡通渲染制作流程,發現里面用到了自定義ToneMapping-Gran Turismo tonemapper,說是可以保持顏色飽和度以及修復過曝區域,比較適合卡通渲染之類的:
然而PostProcessing自帶的Tonemapping里只有ACES和Neutral,而且參數都不讓調。於是google一下,發現colin大佬也問過類似的問題。經過調查發現大致有兩種方式,第一種是直接改文件,具體操作可以參考這里或這里。官方的postProcessing文檔里也有類似方法。不過我本人沒嘗試過,而更傾向於第二種方法,因為相對更加自由。
第二種方法:添加Blit Renderer Feature。這里需要先把相關代碼從Github弄下來,import到項目中,然后可以在UniversalRenderPipelineAsset_Renderer上點擊Add Renderer Feature添加一個Blit Feature(注意Event里放在不同的階段,效果也會不同,如果像圖中所示放置,可能導致Bloom效果不明顯,放到After Rendering Post Processing可能會更好):
這玩意好像可以干很多基於屏幕圖像的后處理的活,要實現自定義ToneMapping的話只需要把ToneMapping代碼寫到Shader里然后創建一個材質,再把材質丟到Blit Material里就可以了,畢竟ToneMapping只需要camera color的信息嘛。
所以剩下的工作就是根據大佬提供的GT Tonemap函數公式寫個shader就可以了!我自己寫了個代碼丑一點的shader版本,不過效果應該是一樣的,感興趣的同學可以戳網盤鏈接,提取碼zfdi。另外Github上也放了一份。
此外我還自己驗證了一下曲線效果,形狀看上去應該沒啥問題,十字線交點表示(0.5,0.5):
最后當然是比較畫質改善了多少啦!左邊是沒有toneMapping的,右邊是用了GT toneMapping的效果:
感覺應該是可以平衡亮度值高的顏色吧,反正應該是更好看了233...