凹凸對映(Bump Map)實現原理

2021-09-08 14:39:30 字數 2362 閱讀 4505

凹凸對映和紋理對映非常相似

。然而,

紋理對映是把顏色加到多邊形上,而凹凸對映是把粗糙資訊加到多邊形上

。這在多邊形的視覺上會產生很吸引人的效果。我們只需要新增一點資訊到本來需要使用大量多邊形的物體上。需要注意的是這個物體是平的,但是它看起來卻是粗糙不平的。讓我們來看看上邊的那個立方體。如果你很近地觀察它時,你會發現它上面的很多細節。它看起來好像是由成千上萬個多邊形構成的,其實它只是由6個矩形構成。你或許會問:「這和紋理對映有什麼不同?」它們的不同之處在於——

凹凸對映是一種負責光方向的紋理對映

(1)凹凸對映背後的原理

讓我們來看看乙個粗糙的表面。

從遠處看,你判斷這個物體是粗糙的的唯一證據是在它表面上下的亮度有改變。你的大腦能夠獲得這些亮暗不一的圖案資訊,然後判斷出它們是表面中有凹凸的部位。上邊的一幅圖就說明了這一點。你可以發現它是乙個浮雕式的表面。一些矩型和字母被印入表面,但是它們摸上去就像是乙個隱藏的監控器的玻璃。如果這個影象是在適當的位置上,那麼它除了改變亮度,不需要再做任何其他的工作。

那麼你也許會問:我是怎麼知道哪些點要亮,哪些點要暗呢?這不難。絕大多數人生活在這樣一種環境下——這個環境的大多數光源來自上方(譯者注:比如白天主要的光來自太陽,夜晚主要的光來自天花板上的日光燈)。

所以向上傾的地方就會更亮,而向下傾的地方就會更暗

。所以這種現象使你的眼睛看到乙個物體上亮暗區域時,可以判斷出它的凹凸情況。相對亮的塊被判斷是面向上的,相對暗的塊被判斷是面向下的。所以我只需要給物體上的線條簡單得上色。

如果你想要更多的證據,這裡還有一幅幾乎相同的圖,不同於前的是它旋轉了180度。所以它是前一幅圖倒轉的影象。那些先前看起來是凹進去的區域,現在看起來是凸出來的了。

這時候你的大腦並沒有被完全欺騙,你腦中存留的視覺印象使你仍有能力判斷出這是前一幅圖,只是它的光源變了,是從下往上照的,你的大腦可能強迫性地判斷出它是第一幅圖。事實上,你只要始終盯著它,並且努力地想像著光是從右下方向照射的,你就會理解它是凹的(譯者注:因為日常生活的習慣,你會很容易把這些圖形判斷成凸出的圖形,但是因為有了上一幅對照圖的印象,你可能才會特別注意到這些圖塊其實還是凹入的,只是判斷方法不符合我們日常生活習慣,因為這時大多數光不是從上方照射,而是從下往上照射)。

(2)什麼是凹凸圖(bump map)

凹凸圖和紋理圖很相似。但是不同的是,凹凸圖包含的不是顏色資訊,而是凹凸資訊。最通常的方法是

通過儲存高度值實現

。我們要用到乙個灰色的紋理圖,灰色的亮度體現出每個點分別凸出多少(見上圖)。這就是乙個非常方便的儲存凹凸圖的方法,而且這種圖很容易製作。這副圖具體又是怎樣被渲染器使用的呢?你接著往下看就會明白了。

當然,你並不一定要把自己侷限於這些簡單的圖形,你可以擴充套件,用它來做木材,做石頭,做脫了漆的牆面,做任何你想做的物體。

(3)那麼它是怎麼工作的

凹凸對映是補色渲染技術(phong shading technique)的一項擴充套件

,只是在補色渲染裡,多邊形表面上的法線將被改變,這個向量用來計算該點的亮度。當你加入了凹凸對映,法線向量會略微地改變,怎麼改變則基於凹凸圖。改變法線向量就會改變多邊形的點的顏色值。就這麼簡單。

現在,有幾種方法來達到這個目的(譯者注:這個目的指改變法線向量)。我並沒有實際編寫補色渲染和凹凸對映的程式,但是我在這裡將介紹一種我喜歡的方法來實現!

現在我們需要將凹凸圖中的高度資訊轉換成補色渲染用到的法線的調節資訊。這個做起來不難,但是解釋起來比較費勁。

好的,我們現在將凹凸點陣圖的資訊轉換成一些小向量——乙個向量對應於乙個點。請看下邊一副放大的凹凸圖。相對亮的點比相對暗的點更為凸出。看清楚了嗎?

現在計算每個點的向量,這些向量表徵了每個點的傾斜情況,請看下圖的描繪,圖中紅色小圓點表示向量是向下的。

有很多計算向量的方法,不同的方法精確度不同,但是選擇什麼方法要取決於你所要求的精確度是個什麼層次。最通常的方法是分別計算每個點上x和y的傾斜度:

x_gradient = pixel(x-1, y) - pixel(x+1, y)

y_gradient = pixel(x, y-1) - pixel(x, y+1)

在得出了這兩個傾斜度後,你就可以計算多邊形點的法線了。

這裡有乙個多邊形,圖上繪出了它的一條法線向量——n。除此,還有兩條向量,它們將用來調節該點法線向量。這兩條向量必須與當前被渲染的多邊形的凹凸圖對齊,換句話說,它們要與凹凸圖使用同一種座標軸。下邊的圖分別是凹凸圖和多邊形,兩副圖都顯示了u、v兩條向量(譯者注:也就是平面2d座標的兩條軸):

現在你可以看到被調節後的新法線向量了。這個調節公式很簡單:

new_normal = normal + (u * x_gradient) + (v * y_gradient)

有了新法線向量後,你就可以通過補色渲染技術計算出多邊形每個點的亮度了。 

了解凹凸對映Bump Map技術的內幕

凹凸對映和紋理對映非常相似。然而,紋理對映是把顏色加到多邊形上,而凹凸對映是把粗糙資訊加到多邊形上。這在多邊形的視覺上會產生很吸引人的效果。我們只需要新增一點資訊到本來需要使用大量多邊形的物體上。需要注意的是這個物體是平的,但是它看起來卻是粗糙不平的。讓我們來看看左邊的那個立方體。如果你很近地觀察它...

轉貼 了解凹凸對映Bump Map技術的內幕

凹凸對映和紋理對映非常相似。然而,紋理對映是把顏色加到多邊形上,而凹凸對映是把粗糙資訊加到多邊形上。這在多邊形的視覺上會產生很吸引人的效果。我們只需要新增一點資訊到本來需要使用大量多邊形的物體上。需要注意的是這個物體是平的,但是它看起來卻是粗糙不平的。讓我們來看看左邊的那個立方體。如果你很近地觀察它...

Unity Shader 中實現凹凸對映

每乙個頂點都有自己的切線空間。在該空間中,z軸是頂點的法線方向,x軸是頂點的切點方向,而y方向則是兩者叉積的方向。我們需要在頂點著色器中把視角方向和光照方向從模型空間變換到切線空間中,即我們需要從模型空間到切線空間的變換矩陣。而很好求的是,這個變換矩陣的逆矩陣正是在頂點著色器中切線 x軸 副切線 y...