遊戲是學習 www.GameIsLearning.url.tw ar vr教育遊戲式學習 王啟榮 unity教學網站 行動遊戲學習平台

討論區 > Unity 教學與學習

【3D】深度測試與 Z fighting

chijung 發表於 2018/09/03_00:59

  在算圖的過程中,3D物件會轉換成平面影像呈現在畫面上。而3D轉2D的過程往往會進行深度測試,辨別物件的前後(遮擋)關係,決定要將像素填入什麼色彩。舉例來說,由視平面上任何1個像素往場景中延伸視線,可能會穿過多個前後排列的物件,此時必需辨別哪個觸及點(測試點)距離視平面較近,然後將像素填入該測試點的色彩。



  視平面以X、Y座標表示平面空間、以Z軸為深度方向,而每個測試點都以Z值代表深度(Z值愈小距離視平面愈近)。進行深度測試時,同一像素對應的所有測試點Z值,會逐一被送到Z buffer(深度緩衝區)中做比較,每次比較後只保留較小值在Z buffer(和色彩值在frame buffer),所以最後會留下Z值最小、距離視平面最近的測試點色彩。



  例如有一個像素對應3個測試點A、B、C,其Z值和色彩分別為0.7(紅色)、0.2(綠色)、0.5(藍色)。首先A的Z值0.7寫入Z buffer、紅色寫入frame buffer(畫面緩衝區)。接著B的Z值0.2被送進Z buffer比較,由於比原來的0.7還小,所以0.2寫入Z buffer、綠色寫入frame buffer。再來換C的Z值0.5被送進Z buffer比較,由於比原來的0.2還大,所以Z buffer和frame buffer中的資料都不改變。透過這樣的測試,可以推算出測試點B距離最近,因此像素會填入綠色。



  理論上,只要比較所有測試點的Z值,就能辨別出彼此的前後關係。但是當兩個面極為貼近(或完全重疊)時,可能會因精確度不足而導致辨別混淆,使緊貼的兩個面呈現穿插閃爍的現象(即Z fighting)。



  解決Z fighting最簡單有效的方法,就是拉大緊貼面之間的距離,使前後關係能被正確地辨別出來。或是在不移動模型的情況下,對重疊面設定Z Offset(Z偏移量)。



建議延伸閱讀:
>> 3ds Max 轉檔 unity 注意要點