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)導入heightmap
2)選中之后將Texture Type改為Normal map
3)勾選Create from Grayscale
4)Apply
之后就看到unity里該圖直接變成了呈藍色的法線貼圖。


 
 
PS: 
Unity3D里自帶的Bump Map Shader,即Bumped Diffuse等Shader是法線貼圖的方式。也就是用的是RGB的法線貼圖,一般呈藍色。Unity自帶的Shader是沒有直接使用灰度圖的,而提供能是灰度圖轉法線貼圖的功能。
 
 
本文部分內容出自
http://freespace.virgin.net/hugo.elias/graphics/x_polybm.htm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM