畫家算法

畫家算法也叫作優先填充 ， 它是三維計算機圖形學中處理可見性問題的一種解決方法 。 當將三維場景投影到二維平面的時候 ， 需要確定哪些多邊形是可見的 ， 哪些是不可見的 。 “ 畫家算法 ” 表示頭腦簡單的畫家首先繪製距離較遠的場景 ， 然後用繪製距離較近的場景覆蓋較遠的部分 。 畫家算法首先將場景中的多邊形根據深度進行排序 ， 然後按照順序進行描繪 。 這種方法通常會將不可見的部分覆蓋 ， 這樣就可以解決可見性問題 。 在有些場合下 ， 畫家算法可能無法解決可見性問題 。 在這個例子中 ， 多邊形 A 、 B 、 C 互相重疊 ， 我們無法確定哪一個多邊形在上面 ， 哪一個在下面 ， 我們也無法確定兩個多邊形什麼時候在三維空間中交叉 。 在這種情況下必須用一些方法對這些多邊形進行切分 、 排序 。 1972年提出的Newell算法就是切分類似多邊形的一種方法 ， 在計算幾何領域人們已經提出了許許多多的解決方法 。 一些基本的畫家算法實現方法也可能效率很低 ， 因爲這將使得系統將可見多邊形集合中的每個點都進行渲染 ， 而沒有考慮這些多變性在最終場景中可能被其它部分遮擋 。 這也就是說 ， 對於細緻的場景來說 ， 畫家算法可能會過度地消耗計算機資源 。 人們有時候也使用逆向畫家算法進行處理 ， 這種算法首先繪製距離觀察者較近的物體 ， 已經進行繪製的部分不再進行其它的繪製過程 。 在計算機圖形系統中 ， 這種方法由於無需根據光照 、 紋理等參數計算被較近物體遮擋的遠處物體的顏色 ， 所以效率非常高 。 但是 ， 這種方法也有許多與普通畫家算法同樣的問題 。 畫家算法的這些缺陷導致了深度緩衝技術的發展 ， 深度緩衝技術可以看作是畫家算法的一個發展 ， 它根據逐個像素的信息解決深度衝突的問題 ， 並且拋棄了對於深度渲染順序的依賴 。 即使在這樣的系統中 ， 有時也使用畫家算法的變體 。 由於深度緩衝實現通常是基於硬件中的固定精度深度緩衝寄存器 ， 因此舍入誤差就會帶來一些顯示問題 ， 即在多邊形連接的地方會出現重疊或者間隙 。 爲了避免這種問題 ， 一些圖形處理引擎使用了 “ 過度渲染 ” 的方法 ， 即根據畫家算法的順序繪製兩個多邊形中受影響的邊界 。 這也就是說有些像素如同在畫家算法中那樣實際上繪製了兩次 ， 但是由於圖像中只有很少的一部分才做這樣的處理 ， 因此對於性能的影響很小 。 Category: 三維計算機圖形學 Category: 計算機圖形算法