視差貼圖(parallax mapping)學習筆記
視差貼圖是一種很神奇的技術,它的效果有點類似法線貼圖,都是通過儘可能少的面片加上特殊的技術來模擬複雜幾何體的視覺效果。通常視差貼圖都會和法線貼圖結合起來使用。
視差貼圖的核心思想,就是通過貼圖時uv座標的偏移,來形成視覺上的幾何體高低視差,給人以立體的感覺。這篇教程很詳細,下面的圖片也是來自於該教程(捂臉):
如圖所示,高度為0.0的平面是渲染時的實際面片,棕色的線則代表了原始幾何體的實際高度。這裡我們一共需要三張紋理:法線紋理,高度紋理以及顏色紋理。
A點是我們在面片上看到的點,B點則是該幾何體(如果是幾何體而非一個面片的話)應該被我們所觀察到的點,很明顯A點和B點對應的紋理座標是不同的,為了模擬實際的幾何體表面,我們需要估計A B之間紋理座標的偏移,這裡又是一個“hack”,這裡我們粗暴的將偏移量通過如下公式計算:
其中的
通過這個UV偏移量得到實際的紋理座標,然後再取該處的法向量和顏色值,最後得到的效果如下圖。
但是上述估計實在過於粗糙,當視線接近水平時,紋理會有很多地方發生扭曲。為了更精確的得出偏移量,又有了下面的方法:
steep parallax mapping
這次我們將深度紋理分層,每層的間隔相同,然後用一種類似於raymarch的演算法,沿著視線方向往下探,每次高度下降一層,當視線與某一層的交點的高度值小於該處深度貼圖中的高度時停止。圖中所示,
這些條帶產生的原因如上圖,注意其中的灰線和綠線,它們是進行“raymarch”時兩層的分界線,他們對應的偏移後的紋理座標區域(灰虛線和綠虛線之間的區域)有很多是重複的,這也就意味著看到的紋理也會因為重複而產生條紋。
線性插值
為了解決這個問題,我們通過線性插值的方式來確定偏移後的紋理座標,使精度進一步提升,而且更平滑:
如上圖,現在我們不再簡單的取
當
最後很感謝參考文章中的作者,講的深入淺出,插圖也很直觀(我順便也可恥的利用了一下)。