• 沒有找到結果。

第三章 技術討論

3.3 Relief Mapping

Relief Texture Mapping 由 Oliveira 發表於 2000 年的博士論文[15],與 bump mapping 相同也是一種利用貼圖的繪圖方式,然而比起 bump mapping 更具立體感,

利用物理原理在貼圖上模擬深度(height field),藉由視角向量交集高度場的 點來決定其高度以供後續打光處理,此方法能夠展現出 3D 表面的細節,擁有自 我遮蔽、自我陰影等效果。

3.3.1 Relief mapping basics

Relief texture maping 使用貼圖變形的技巧使得每個像素產生了複雜幾何 細節的錯覺,此深度的資訊來自於表面的一段距離的計算,使用的高度圖如圖 3.9 中所示,用 RGBα貼圖來儲存 normal map [POC05] ,height map 利用原圖做灰 階的原理便能完成,而 normal map 則是利用 height map 做該點的法向量計算而 來,可利用如 CrazyBump 等工具來創建。

19

圖 3.10:Color map、height map、normal map 比較圖。

3.3.2 binary search

首先,將來自 height map 的高度場 normalize 在[0,1]之間,如圖 3.10 所 示,B 點的深度最深為 1,A 點最淺為 0,視點 A 到點 B 的向量 V 由 A 點往 B 點前 進,利用 binary search 來尋找交集點 [POC05],如圖中所示第一次並未找到,

於是進行第二次找尋,直到第三次找尋時找到交集點,然而若一直取中點搜尋都 沒搜尋到呢?所以要訂立一個 binary search 的限制,此限制攸關效能與成果,

搜尋次數太少,則細節差,次數太多則影響運算效能。

圖 3.11:Binary search 於高度場示意圖。第三次 binary search 找到的交集點,

取得該深度為 dv。

B

A

3 1 2 0.0

1.0 深度

交集點

深度

20

然而此方式有著一種問題,如圖 3.11 所示,第一次 binary search 後,交 集點還沒找到,於是往更深的地方找,最終找到的交集點卻與視覺上從視點 A 看 過應該碰觸的交集點不同,為了解決這個問題,我們需要採用 linear search 的 方法來完成。

雖然此部分得改用 linear search 方式,但並非表示 binary search 無用,

利用 linear search 找尋到交集點的那個區間後,使用 binary search 完成找到 最後交集點的判斷,如此可以加速運算。

圖 3.12:Binary search 交集點錯誤圖 [POC05]。計算出的交集點,向量由 A 點到 B 點之前也有交集點,真正該看到的點便有錯誤。

3.3.3 linear search

找尋交集點方法改用 linear search,由視點 A 朝 B 點每次前進一小段距離,

如此能確保先碰觸到的交集點為應該看到的點,如此便解決先前交集點錯誤的問

B

A

3 1 2 0.0

1.0 深度

正確交集點

錯誤交集點

21

題。在最後一個交集點的區間時再交給 bineary search 來做,除了保有上述優 點外,對效能也有幫助。

圖 3.13:linear search 示意圖 [POC05]。

3.3.4 Self shadow

自我的陰影遮蔽如圖 3.13 所示,當從視點 A 到點 B 的向量算出交集點後,

利用該點到光源向量做搜尋是否有交集點存在,可以使用原本由視點 A 到點 B 的 判斷交集方式來做,以此便能斷定是否在陰影之內。

B 0.0 A

1.0 深度

每次前進深度 1

2

3

22

圖 3.14:自我遮蔽示意圖 [POC05]。

3.3.5 實作細節

Relief mapping 最重要的為產生自我遮蔽的效果,我們必須計算出交集點,

首先自 vertex shader 中取得的貼圖座標做為 A 點,以視點 A 到點 B 的向量 normalize 高度為 1 之後做為向量 V,如此點 B 的表示為點 A 加上向量 V。

完成上述工作後便能開始進行搜尋,首先進行 linear search,根據設定的 linear search steps 算出前進的深度 t,接著透過 height map 取得由點 A 往點 B 前進深度 t 之後 height map 上該處的深度 d,若 t>d 則表示已經有交集點了,

接下來該使用 binary search 來找尋交集點位置。

在先前所計算的發生交集點的區段上,使用前後一個 step 的深度作為上下 界限進行 binary search,一樣設置一個 binear search steps 來控制搜尋次數,

使得找尋到交集點或到達搜尋上限時認定其為交集點,便能得到交集點深度,也

B 0.0 A

1.0 深度

交集點 深度

C

23

能由此得知該點座標。

後續則利用此座標取得 color map 的顏色以及 normal map 的法向量,以供 內積的打光處理,最後需要計算自我陰影的問題,方法與先前的搜尋相同,一樣 經過 linear search、binary search,不同的只有進出點用的是交集點往光源向 量所得,算出朝光源方向是否有交集點後便能知道是否有遮蔽到,關閉 diffuse 及 specular 以改變打光方式,使該點呈現陰影,參見附錄 A.3。

相關文件