第三章 研究方法與步驟
3.5 斷層處理
glsl 的 fragment shader:
uniform samplerRECT DepthTex;
void main(void) {
float frontDepth = textureRect(DepthTex, gl_FragCoord.xy).r;
if (gl_FragCoord.z <= frontDepth) { discard;
}
gl_FragColor = vec4(gl_FragCoord.z, gl_FragCoord.z, gl_FragCoord.z, 1.0);
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
25
3.5.1 斷層處理
擁有了四層的深度之後我們可以一、二層深度做光線相交算法再把結果與第 三層做相交算法,最後再做第四層,然而由於內部深度會因為 3D 物體的形狀而 有斷層的產生,如圖 3.13 紅色的部分即為甜甜圈模型在第二層深度產生斷層的 地方。由於光線相交的演算法是以深度的大小來判斷其交點,因此斷層的出現,
會造成判斷上的錯誤。
(a) (b)
圖 3.13: (a) 環形模型不產生斷層的角度 (b) 環形模型第二層深度產生斷層處
因此我們提出對於斷層深度處理的光線相交演算法,首先我們觀察發現,折 射向量進入 3D model 後會被斷層所影響的情形有三種:
定義: 折射向量 T,光線相交算法線性搜尋 step 的長度為 SIZE,搜尋到的 深度比深度貼圖深度還小者差值為+,反之為−。
圖 3.14: 物體紅色實線為產生斷層的深度,黑色虛線為物體的輪廓
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
26 Case1:折射向量經過斷層的上方且不與之相交
此種情況下線性搜尋的前一個點與後一個點的深度雖然因為斷層而造成深 度與深度貼圖的差值有劇烈變化,但因為差值還是為+。因此繼續線性搜尋,如 圖 3.14。
(a) (b)
圖 3.15: (a) 3D model 產生的斷層 case1,T 為折射向量,(b) 以 bunny 為例 Case2:折射向量經過斷層中間且不與之相交
此種情況下線性搜尋的前一個點的差值為+,後一個點的差值為-,因此線性 搜尋判斷停止,如圖 3.15(左),接著進行二元搜尋,在搜尋時分別記錄最後一次 搜尋到差值為+與-的深度,當二元搜尋結束時比較最後一次搜尋到+與-的深度貼 圖深度,兩者差值必定會大於 size 的值,如圖 3.15(右)。
(a) (b)
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
27 (c)
圖 3.16: (a) 3D model 產生的斷層 case2,(b) T 為折射向量 (右)二元搜尋(c) 以 bunny 為例
Case3 折射向量經過斷層且與之相交
此種情況下線性搜尋的前一個點的差值為+後一個點的差值為-,因此線性搜 尋判斷停止,如圖 3.16(左),接著進行二元搜尋,在搜尋時分別記錄最後一次搜 尋到差值為+與-的深度,當二元搜尋結束時比較最後一次搜尋到+與-的深度貼圖 深度,兩者差值在大部分的情況下小於 size 的值,如圖 3.16(右)。
(a) (b)
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
28 (c)
圖 3.17: (a) 3D model 產生的斷層,case3 (b) 二元搜尋,(c) 以 bunny 為例
分析 case2 與 case3 之差別處在於二元搜尋時 case2 會逼近斷層處,而 case3 則是交點處,因此可以產生區別。
Case3 二元搜尋後兩者差值在大部分的情況下會大於 SIZE 的值,也就是說,
會有特例的情況,如圖 3.18,最後的深度圖差值>size,解決的方法就只有增加 二元搜尋的次數或者將 size 的值調整變小。
圖 3.18: case3 的特例
Case2 由於判斷線性搜尋停止但實際上並未停止,因此我們需要額外的 flag 來幫助我們判斷折射向量在斷層下的深度判斷,如圖 3.19。
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
29
圖 3.19: 若 case2 不與斷層相交則繼續線性搜尋
以上敘述的斷層是 model 與 model 之間所產生的,另外也有模型與背景產 生的斷層,而這種斷層在前兩層的計算並不會產生問題,因為前兩層的深度貼圖 對於每一個 fragment 都可以找到對應的值,但到了第三層,由於模型的某些部 份只有到兩層的深度,而造成第三層的計算會產生如圖 3.20(左)之錯誤。以甜甜 圈第四層為例子產生錯誤位置如圖 3.20(右)所示,紫色圓圈圈起來的部分就有可 能因為斷層太短而造成判斷錯誤的情況。
圖 3.20: (左)甜甜圈的第四層的錯誤 (右)二層深度後的錯誤
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
30
3.5.2 深度合併
因為圖 3.20 的錯誤,我們提出多層深度合併的方法來解決此問題,我們觀 察到四層深度的情況下第二層與第四層深度往往會有相連的地方,而第一層與第 三層也一樣,如圖 3.21 所示,黑色數字表示層數,藍色向量為某一折射向量,
我們發現若能把第四層深度以第二層合併並保留第四層深度便可以解決圖 3.20 因為深度貼圖並未對應到交點的問題。
圖 3.21:可以合併第一層與第三層&第二層與第四層
合併方法以甜甜圈第四層為例,首先第四層深度減掉第二層深度得到圖 3.22 的橘色線(差值),接著以第二層深度加上之前所產生的差值,if(產生的深度差值 為 1)則為第二層深度 else 第四層深度,最後結果在取代原本的第四層深度。
圖 3.22:合併第二層與第四層
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
31
圖 3.23: 取代的第四層深度
3.5.3 Size 大小的影響
由於光線相交演算法的精準度取決於 size 的大小,如果太大或太小都會產生 錯誤的結果,當 size 太大的時候容易產生如圖 3.24 的右邊:由於牛的模型中腳的 部分比較纖細。我們設定 frustum 深度由 0 到 1,當 size 設定為 1/5(線性搜尋 5 次)時會產生找不到交點的情況而產生錯誤的結果,至於當 size 太小,如 1/500(線 性搜尋 500 次)的時候又因為斷層的判斷方式導致判斷錯誤的情況如圖 3.25,因 此在時間與品質的考慮下,1/50 最為適合(線性搜尋 50 次)。
圖 3.24: 左: size=1/5 的深度圖於折射結果,右: size=1/50 的深度圖於折射結果