光照模型的量化缺陷和噪聲抖動緩解
范例一:dot(N,L)的色階問題
各光照模型都存在dot(N,L)一項??扇绻阍诘凸鈴妶鼍?,大平面上去看這個計算結(jié)果,基本上都能看到“階梯狀”的不平滑:

如果不相信我說的,那可以看一下我在shaderToy上展示的范例,最簡單的dot(N,L):
https://www.shadertoy.com/view/NldfRl

在部分手機和電腦屏幕中,即能看到色階,全屏shader后會比較明顯。(在我的手機上,由于屏幕電路板內(nèi)置抖動算法,所以不明顯)。
根本原因是我們的物理屏幕在2022年還達不到RGB24(即R8,G8,B8,也就是2^8=256色或256^3=16,777,216色)以上的顏色精度(甚至大部分硬件屏幕不嚴(yán)格滿足,許多低端硬件因為只有10來位色,所以為了緩解色階問題,在電路中內(nèi)置抖動算法)。
階段總結(jié):
只要是細(xì)膩的顏色變化,就會在當(dāng)代屏幕上產(chǎn)生色階,這是數(shù)據(jù)精度>顯示精度 造成的。
聲明:
為什么我要說這是“光照模型”的缺陷呢?明明是硬件問題。因為任何一個光照模型總歸會產(chǎn)生數(shù)據(jù),這些數(shù)據(jù)總歸要量化,今天有256色問題,明天就會有512色問題。我認(rèn)為計算機渲染學(xué)科應(yīng)當(dāng)將處理手段——噪聲抖動,加入到光照模型中,使得學(xué)習(xí)者能從一開始避免掉這些問題,因為“光照模型”本身就是一個非常經(jīng)驗化的東西。
范例二:GGX高光的跨階問題
在使用procedural normal map的時候,我發(fā)現(xiàn)對于高光部分,只要normalMap對法線稍微“過分”的偏轉(zhuǎn),從非正面看的時候,就會有明顯的"切割感"。對于diffuse比較亮的材質(zhì),不明顯;當(dāng)diffuse項貢獻低,specular高的時候,這種切割感變得無法接受:

甚至不需要看這種復(fù)雜材質(zhì),只要讓N = normalize(N+0.1*T)就行了,從-T方向的側(cè)邊看去,就會有嚴(yán)重的分割感:

實際上跟到PBR_GGX的公式里看的時候,這個現(xiàn)象是“合理”的。有兩種情況的黑色
“黑色”部分就是該金屬的diffuse部分,由于眼睛沒有正對著光線反射方向,所以沒有高光,基本全黑,參考鏡子。
normalMap“過分”調(diào)偏了N,使得dot(N,V)<=0或者過分小,代入PBR公式變黑,并且邊緣power特別明顯,帶上顏色后基本只能看到硬硬的分界直線。傳統(tǒng)光照模型中不存在dot(N,V)項,并且多用H,所以這個現(xiàn)象不明顯??梢灶惐仍赨nity中把NormalMap的強度過分增強,結(jié)果往往是變黑變臟。
對于情況2,可以適當(dāng)調(diào)節(jié)normalMap的強度。可是對于情況1,可以參考圖金1的藍(lán)色勾和叉部分,其實都是正常的,但是叉部分看著就是比勾部分生硬得多。
怎么解決呢?參考范例一中的噪聲抖動,往金屬上撒上噪聲,也就是N加上噪聲,減弱色階問題,加強整體聯(lián)系感:

這個黑色“跨階”問題大不大,其實很大程度上取決于你的大腦主觀意識,一但你接受了“它是鏡子正常黑”這一正確觀點,其實就完全感覺不出來問題;反之,就會總覺得有怪黑色像壞了的normalMap。類似以前很火的裙子黑金還是白藍(lán)問題。
我下面上3張動視角圖,讀者可以自行去感覺這個黑色問題:



如果單看圖g3,并去掉噪聲(于是黑金的邊緣便十分硬),也許你會覺得這個黑色區(qū)域十分不合理。
看到這,不知讀者是否贊同我的觀點,噪聲抖動應(yīng)該加到光照模型里面,或者至少應(yīng)該成為我們學(xué)習(xí)圖形學(xué)的必經(jīng)之路,但可惜國內(nèi)學(xué)習(xí)路徑里很少看到談它。