最近做高質量實時HDR PBR渲染中碰到了2個關鍵問題,若干思考如下:
問題1: 極高的動態范圍HDR+高級BRDF+相對較低的采樣率(比方說不考慮子像素的原始分辨率),在這3項因素的綜合作用下,Specular Aliasing基本上不可避免。這已經不是存不存在Specular Aliasing的問題,而是如何去面對、何時面對的問題。模型精度越高、工作流越傾向于全PBR方式、光照計算精確程度越高,則反射高光走樣越明顯。
問題2: 另外還有個麻煩,就是在不引入前期baking機制的前提下使用IBL,會不可避免地導致occlusion信息缺失,從而產生異樣的反射高光。occlusion是個挺麻煩的topic,無論是用SH+PRT、還是用Soft Shadows+AO,總是會產生這樣那樣的問題;曾一度嘗試采用ScreenSpace Ray Marching的方式來動態生成occlusion,但感覺上這種做法產生的visibility是低質量的,且帶來的性能損耗也不小。而且,在HDR+高級BRDF的環境使得因visibility缺失而導致漏光這個問題更加雪上加霜。
上面這2個問題呈現出來的異常現狀是類似的,那就是異常的反射高光,但它們卻是由于不同的原因所導致的,因此,在改善上述問題之前,首先必須對其進行合理的區分,后繼改善方具備針對性。
先說第一個問題,從已有手段來看,基于屏幕空間的AA是實踐中克服Specular Aliasing的最主要手段之一。Toksvig、LEAN、CLEAN等關注于優化Normalmap mipmap filter的做法并不是首選,因為它們不僅要大規模修改法線貼圖資源,而且其理論依據中適用的BRDF也只是Blinn-phong這種大路貨,效果不顯著不說,而且還缺乏后期人為調整的靈活性,本質上來說,屬于前期手段而非后期手段,調節手段與最終效果之間拉得太長,所以最終效果要是出了問題就會很麻煩,因此直接棄用。而使用FXAA、MLAA、TXAA等AA技術來解決這個問題的好處則在于,其把所有specular aliasing的問題集中在一個后處理環節上加以徹底解決,而且解決的程度(模糊一點?銳利一點?是否需要留一點aliasing以體現細節?等等)還可以靈活控制,這是基于貼圖的反高光走樣技術做不到的。AA有自己獨到的優勢,其工作在LDR空間,而不是HDR空間,本身就是基于人眼感知能力所進行的直接優化,因此不僅靈活,而且簡單粗暴、直接有效。另外值得一提的還有超采樣AA,作為一個簡單的box filtering,實踐證明,如果其運行在linear空間下,是不足以壓制HDR PBR環境下的反射高光走樣的,因為HDR+PBR BRDF導致的像素照度差異實在是太BT了,但還是能夠帶來部分的改善,尤其是跟其他基于LDR 的屏幕空間AA技術結合使用的情況下,細節與高光走樣改善極佳,唯一缺陷就是對性能的負面影響太大。此外,還有一個因素,就是模型精度問題,良好的模型預處理(如法線計算、頂點拆分/合并、tangent/bi-tangent計算等)是解決高光走樣的基礎前提,因為法線是反射高光的決定性因素之一,這個基礎前提達不到,后面的AA、貼圖filter等效果均不會達到良好的效果。最后,提一提物理正確的問題,保持物理正確是一種情結,但是,Specular Aliasing這一問題其實本質上源于采樣不足,而HDR+PBR光照計算以極其夸張的方式使得這一問題變得更加惡化,直至效果無法讓人接受,所以,在采樣數量達不到與HDR反射高光(高頻detail)相匹配的驚人程度時(甚至HDR SSAAx8/x16都不夠,在實時計算環境下無限制拔高采樣率在性能方面幾乎是無法接受的),Specular Aliasing在物理正確的光照計算框架范圍內是無法解決的,因此,我們只能by all means,包括像AA這種非物理正確的后處理方式,實踐證明這是有效的,所以此處實際上是有選擇的暫時揚棄了“物理正確”原則,以獲得有效的處理效果,但我想強調的是,這是合符情理的。
然后再說第二個問題,針對occlusion信息缺失所導致的漏光,在實時+準GI場合(如游戲等)下,目前業界真正提出來的簡單、有效的辦法并不多,基本上只有基于AO信息的specular occlusion比較實用,盡管這種直接利用ambient occlusion因子來推導得出高光遮蔽因子so的方式并不物理正確,本質上只是個hack,且其效果不僅取決于AO質量、同時也取決于模型質量(因為模型質量能在一定程度上決定AO質量),但簡單易行,性能代價也極低,聊勝于無,如果采用tri-Ace那種以視覺效果為導向的光照分量合成hack,用下來也能起到不錯的改善效果。除此之外,還有一類方法,就是基于SH/H3等球諧基的baking方法,比如1886,在baking階段把visibility因子用QMC方式求取出來然后存入頂點或貼圖,用于在運行時進行動態occlusion query,這種高大上的預處理手段當然效果是最好、最精確的,但工作代價也是最大的,需要工作流的全面配套梳理;最后,還有一類方法,就是基于sphere set approximation等proxy的occlusion近似計算方法,比如last of us,這種方法在相對低動態范圍的畫面環境下,也能夠得到不錯的陰影遮蔽效果。此外,還有一些宣稱用Visibility預計算(其實是form factor,呵呵)+烘焙相結合能搞得定的系統級方案,如enlighten等radiosity system,那已經是屬于準baking的重量級方案了。總體而言,考慮到Specular Leaking的實質問題在于為提升實時渲染效率而引入的遮蔽與光照分離,在存在預計算手段或者是不那么計較計算代價的前提下,其是有可能以近似物理正確的方式加以解決的,這個是其與Specular Aliasing的一個關鍵差異。
綜上,一通思考下來,上述兩個問題,其實都是目前物理真實向實時渲染管線的系統性問題,暫時都還沒有一勞永逸的golden standard,只能應地制宜,根據情況靈活調整,本質上還是取決于經驗與權衡。實際上,從經驗來看,嚴格來講,高光走樣與漏光幾乎涉及到pipeline的幾乎每一個環節的細節,從貼圖-模型處理、到AO/SO質量、到HDR pipleine平衡性、到PostFX、再到AA質量,每一個環節均需小心應對最終方可有效減輕。此篇blog,是為一階段性小結。
文章列表