第三章 技術討論
3.2 Bump Mapping
Bump mapping 於 1978 年由 Blinn 發表 [Bli78],在電腦圖學領域的應用在於 模擬物體表面的凹凸皺紋,其利用擾亂物體表面法向量的方式來影響期打光的計 算,使得少量三角片下的模型能產生有如大量三角片模型的效果。
圖 3.4:使用 normal mapping 差異圖。Normal mapping 是最使用的 bump mapping。
摘錄自 [20]。
15
3.2.1 Bump mapping basics
Bump mapping 與 displayment mapping 相比並未真實改變物體表面的幾何形 狀,還是能將粗糙的凹凸效果展現出來,如圖 3.5 雖然邊緣及陰影上沒辦法如同 displayment mapping 一般有真實物體的 3D 細節,但也因為沒改變幾何的關係,
bump mapping 繪圖速度很快。
圖 3.5:Bump mapping 與 displayment mapping 比較圖。左邊的 Bump mapping 在物體及陰影邊緣上可以看出破綻,改變幾何的 displayment mapping 則沒有此 問題,但 bump mapping 的優點是效能。摘錄自[18]。
Bump mapping 有兩種方式來實作,第一種為使用 height map,heigh tmap 來自貼圖的灰階圖,白色表示高,黑色表示低,利用 height map 來計算表面的 法向量 [18],最後利用計算出的法向量再做其他繪圖動作。
另一種方式為 normal map,如同上述算出法向量的方式,先把 height map 經過計算產生出一張法向量圖(Normal Map),有現成工具如 CrazyBump 能產生 此圖,簡單產生 normal map 的方法說明如圖 3.6,圖像示意如圖 3.7,利用此 normal
16
map 作為該點的法向量,便能在光源的影響下讓人產生 3D 的錯覺,原本用來計算 phong shading 的法向量改用經過擾亂後 normal map 的法向量。
圖 3.6:由 Height map 求 normal map 計算示意圖。利用要計算的點 p 相鄰的四 個點做兩個向量的外積便能求得法向量。
圖 3.7: 利用 height map 擾亂 normal 示意圖。原物體表面經過高度圖模擬深 度後,擾亂了原本的法向量 [Mik08]。
圖 3.8:擾亂法向量後示意圖。原本能眩光的角度經過擾亂後的法向量內積,可 能無法產生眩光。
物體表面 高度圖
物體模擬深度表面 擾亂後的法向量圖
擾亂後法向量 原法向量
x p1 x p3 p p4 x p2 x
x are not important points, p1~p4 is neighbors of p.
Normal of p = (p1-p2) X (p3-p4)
17
現今最常使用的 bump mappingz 方式為採用 normal map,稱為 normal mapping,
經過現成工具如 CrazyBump 可從原圖產生 [7],在繪圖上便能直接使用,降低繪 圖的負擔以增進效能,其把法向量資訊利用 RGB 方式儲存,因 RGB 數值只能在 0~255 之間,此為 normal map 顏色偏藍的原因,比較如圖 3.8。
圖 3.9:原圖與 normal map 比較圖。Normal map 經 height map 計算後,利用 RGB 儲存各點的法向量。
3.2.2 實作細節
Normal mapping 主要技術在於使用 normal map 來取代繪圖當中模型三角片 上各像素的法向量,利用此經過高度圖(Height Map)所計算出來的法向量擾亂,
搭配入射光與其內積後所產生的明暗效果便能使人產生 3D 的錯覺,使得平面也 能有立體感,借此能大大提升效能。
Vertex shader 需要計算好頂點到光源向量、頂點到視點向量及頂點位置,
以供 fragment shader 做之後的繪圖使用。Fragment shader 除了使用貼圖座標 來取得貼圖顏色之外,最重要的為以此座標取得另一張貼圖-normal map 來取得 法向量,依此法向量與頂點到光源向量算出反射光,在 specular 高反光計算便
18
能以此反射光與頂點到視點向量做內積,以此為基底搭配眩光參數借此控制眩光 大小。
Diffuse 與 ambient 都要乘上貼圖顏色,diffuse 必須使用先前用 normal map 計算出的法向量與光源向量做內積,此打光使用方法與先前 phong shading 相同,
本實作上為了區分效果,另外加上了沒有貼圖顏色的繪圖控制,最終只要將 ambient、diffuse、specular 相加便算出每個 pixel 的顏色。