前言:這篇文章解釋「法線貼圖」如何產(chǎn)生丹诀。翻譯自國外大神的文章
原理
法線貼圖生成器首先做的是將輸入圖像轉換為灰度圖像腺逛,即使它是彩色的陵吸,這是因為顏色信息在生成過程中實際上是無用的脆烟,因此建議你在使用法線貼圖生成器之前將輸入圖像轉換為灰度绍妨,原因將在下一節(jié)中變得清晰盅抚。
想象一下漠魏,圖像是一個頂點網(wǎng)格,每個頂點代表一個像素妄均,每個頂點的 z 位置(高度)等于它的值(這只是一個標量而不是 RGB 矢量; 因為它是一個灰度圖像)柱锹。因此我們意識到圖像只是一個 2D 函數(shù),它將值與空間中的每個點相關聯(lián)丰包,它不是連續(xù)函數(shù)禁熏,因為它僅在空間中的某些離散點上定義。我們剛剛描述的這個表面在每個頂點都有法線(就像你的網(wǎng)格有法線一樣)邑彪,那些法線就是法線貼圖存儲的瞧毙,所以生成器的工作就是簡單地計算表面的法線并在圖像中對其進行編碼。可以使用表面的偏導數(shù)計算法線的分量:
在公式中, 是代表著表面的函數(shù)宙彪, 是單位法向量矩动。我在我另一篇文章中 Normal Map Generation 解釋地更詳細。偏導數(shù)描述了表面的梯度和方向您访。只要我們知道什么是對稱導數(shù)(Symmetric Derivatives)就可以計算局部導數(shù)铅忿。我在另一篇回答 中介紹過。
假設我們有偏導數(shù)灵汪,我們可以使用前面的方程計算法向量分量檀训。法線貼圖將法線矢量的 分量分別存儲到圖像的 通道中。如果我們試圖這樣做享言,我們會遇到一個問題峻凫,圖像只能存儲小于 1 的正值(假設使用標準圖像格式),法向量分量總是小于 1览露,因為它是單位向量荧琼。但是矢量分量可以是負的,表示與空間的基本矢量相反的方向差牛。
因此我們必須找到一個方法使數(shù)據(jù)從 [-1, 1] 映射到 [0, 1]命锄。方法如下:
在這里, 和 是紅綠通道偏化,注意我們并沒有映射 z脐恩。因為它總是正的。再想想這個重新被表示的圖片侦讨,它的法向量總是面向 z 軸正方向驶冒。通過使用之前的等式,我們可以得到 值放在法線貼圖里面韵卤。
現(xiàn)在道理講清楚了骗污,我們開始實現(xiàn)了。再啰嗦一句沈条,如果你需要更多這方面的內容可以看我另一篇文章 Normal Map Generation
實現(xiàn)
我們可以創(chuàng)建一個節(jié)點組需忿,在給定輸入圖像的情況下計算和 偏導數(shù)叠纹。實現(xiàn)就像翻譯和減法一樣簡單:
有關更多信息楼眷,請參閱該文章,其余的實現(xiàn)就像應用上面的兩個方程并從各個通道創(chuàng)建一個圖像一樣簡單旺芽。
最后結果
PS:
他的文章 404 了:(
我也不知道那個 F 函數(shù)是什么季稳。擅这。。先這樣吧景鼠≈亵幔卡在這里很久了痹扇。