原創文章如需轉載請註明:轉載自風宇沖Unity3D教程學院
Shader第十九講 凹凸貼圖
本講分為兩個部分一:原理二:實現
一:原理
(1)眼睛與光讓我們來看看一個粗糙的表面。
從遠處看,你判斷這個物體是粗糙的的唯一證據是在它表面上下的亮度有改變。你的大腦能夠獲得這些亮暗不一的圖案資訊,然後判斷出它們是表面中有凹凸的部位。左邊的一幅圖就說明了這一點。你可以發現它是一個浮雕式的表面。一些矩型和字母被印入表面,但是它們摸上去就像是一個隱藏的監控器的玻璃。如果這個映像是在適當的位置上,那麼它除了改變亮度,不需要再做任何其他的工作。
那麼你也許會問:我是怎麼知道哪些點要亮,哪些點要暗呢?這不難。絕大多數人生活在這樣一種環境下——這個環境的大多數光源來自上方(譯者註:比如白天主要的光來自太陽,夜晚主要的光來自天花板上的日光燈)。所以向上傾的地方就會更亮,而向下傾的地方就會更暗。所以這種現象使你的眼睛看到一個物體上亮暗地區時,可以判斷出它的凹凸情況。相對亮的塊被判斷是面向上的,相對暗的塊被判斷是面向下的。所以我只需要給物體上的線條簡單得上色。
如果你想要更多的證據,這裡還有一幅幾乎相同的圖,不同於前的是它旋轉了180度。所以它是前一幅圖倒轉的映像。那些先前看起來是凹進去的地區,現在看起來是凸出來的了。
這個時候你的大腦並沒有被完全欺騙,你腦中存留的視覺印象使你仍然有能力判斷出這是前一幅圖,只是它的光源變了,是從小往上照的你的大腦可能強迫性地判斷出它是第一幅圖。事實上,你只要始終盯著它,並且努力地想像著光是從右下方向照射的,你就會理解它是凹的(譯者註:因為日常生活的習慣,你會很容易把這些圖形判斷成凸出的圖形,但是因為有了上一幅對照圖的印象,你可能才會特別注意到這些圖塊其實還是凹入的,只是判斷方法不符合我們日常生活習慣,因為這時大多數光不是從上方照射,而是從下往上照射)。(2)法線之前15講提到過,法線對光的反射很重要。而一般來說一個三角形上某點的法線就等於垂直整個三角型的法線。但是我們可以通過灰階圖或者從法線貼圖取得法線,達到更真實的畫面效果。
二:實現(1)與灰階圖疊加 這種方式也叫fake bump mapping,假凹凸貼圖。因為並沒有改變物體表面點的位置或者法線。僅僅是把Bump
Map疊加在已經渲染好的表面上,造成亮度上的擾動,從而讓眼睛以為是凹凸的。計算複雜度是基本加減法。缺點是並不會隨著光方向的改變而改變明暗地區。
(2)產生法線由於(1)的方法有不能對光進行反應的硬傷。於是有了更逼真的方法:用高度計演算法線。高度計演算法線的方法比較多,這裡主要介紹的是CG裡廣泛採用的一種。方法:在對灰階圖上的點採樣的時候,不單取該點的高度Hg,而且取該點之右的點Hr和該點之上的點Ha以這三個點作2個向量:第一個向量V1是(1,0,Hr - Hg) 第二個V2是(0,1,Ha - Hg)法線為 單位化後的 v1與v2的向量積。
如果把結果儲存在一張圖上,那麼就產生了法線貼圖了。Unity3d能替我們做這些,將灰階圖轉換為法線貼圖。就是下面的(3)
(3)Unity裡高度圖轉法線貼圖具體步驟:1)匯入heightmap2)選中之後將Texture Type改為Normal map3)勾選Create from Grayscale4)Apply之後就看到unity裡該圖直接變成了呈藍色的法線貼圖。
PS: Unity3D裡內建的Bump Map Shader,即Bumped Diffuse等Shader是法線貼圖的方式。也就是用的是RGB的法線貼圖,一般呈藍色。Unity內建的Shader是沒有直接使用灰階圖的,而提供能是灰階圖轉法線貼圖的功能。本文部分內容出自http://freespace.virgin.net/hugo.elias/graphics/x_polybm.htm