2013-02-16 159 views
2

我正試圖在軟件級別實現圖形管道。我現在有一些剪輯和剔除的問題。我應該在哪個階段進行剔除和裁剪,我應該如何在裁剪後重建三角形

基本上,主要有兩個顧慮:

  1. 時候應該背面剔除發生?眼座標,裁剪座標或窗口座標?我最初在眼睛座標上做了剔除過程,認爲這樣可以減輕裁剪過程的負擔,因爲許多背面頂點已經被丟棄。但後來我意識到,這樣頂點需要進行2次矩陣乘法,即左乘法模型 - 視點矩陣 - >剔除 - >左乘法透視矩陣,這在一定程度上增加了開銷。

  2. 如何裁剪和重建三角形?據我所知,剪切發生在剪切座標中(透視變換後),換句話說齊次座標中每個頂點正在被確定是否不應該通過比較它的x,y,z分量與w分量而被丟棄。到目前爲止很好,對吧?但在此之後,我需要重建那些丟棄了一個或兩個頂點的三角形。我搜索了一下,Liang-Barsky算法在這種情況下會有所幫助,但是在裁剪座標系中我應該使用哪個裁剪平面?我應該只記錄剪切後的三角形並在NDC中重建它們?

任何想法都會有所幫助。謝謝。

回答

3

(1)

背面剔除可以發生在任何你想要的地方。

在3dfx硬件上,可能還有其他只有光柵化的卡,它是在窗口座標中實現的。正如你所說,讓你處理一些你永遠不會使用的頂點,但是你需要權衡其他成本。

你也可以選擇世界座標;你知道相機的位置,所以你知道從相機到臉部的矢量 - 只要去任何邊緣頂點。因此,您可以測試與正常情況相對應的點積。

當我爲一個基於z80的micro實現一個軟件光柵時,我超越了這一步,並將相機轉換爲模型空間。所以你得到了模型矩陣的逆矩陣(在這種情況下便宜,因爲它們保證了正交,所以轉置就可以),將它應用到攝像機,然後從那裏剔除。它仍然是一個矢量差分和點積,但是如果您僅將曲面法線用於剔除,那麼無需爲了相機的利益而轉換它們中的每一個。對於那個特定的渲染器,我可以繼續前進,從中可以看到哪些面,以確定哪些頂點是可見的,並只將它們轉換爲窗口座標。

(2)

上薩瑟蘭 - 科恩一個變體是我記得看到最常見的事情。你可以在多邊形的外側進行正向掃描,依次檢查每個邊緣並進行適當的調整。

因此,例如,從點(V1,V2,V3)之間的凸多邊形開始。對於每個裁剪平面輪流你會做這樣的事情:

for(Vn in input vertices) 
{ 
    if(Vn is on the good side of the plane) 
     add Vn to output vertices 

    if(edge from Vn to Vn+1 intersects plane) // or from Vn to 0 if this is the last edge 
    { 
     find point of intersection, I 
     add I to output vertices 
    } 
} 

並重復每個飛機。如果你擔心重複成本,那麼你需要採用一種在面和邊之間額外增加間接級別的結構,或者只保留一個緩存。一旦將它們標記爲「入」或「出」,您可能會做一些操作,如緩存頂點,然後緩存每個邊的交點,並通過鍵(v1,v2)查找。如果你已經設置了額外的間接級別,然後將結果存儲在邊緣對象中。

+0

謝謝@Tommy的建議。那麼你什麼時候做Sutherland-Cohen測試並計算邊緣和平面的交點?裁剪座標?假設一個三角形TriA(v0,v1,v2)處於剪切座標中,並且我將每個頂點的x,y,z與它的w值進行比較,結果應該丟棄v1,v2。問題來了,我應該在這之後做些什麼?將edge01和edge02的三角形和計算機交叉點標記到某個平面上? – Nowibananatzki 2013-02-16 04:35:36

+0

再次,我猜想有各種各樣的答案,但我個人通常在變換到相機空間後剪輯,以移除'x> z','y <-z','z <1'等等,以便您支付這種變化,但不是爲了投影。在一個非常小的系統上,這是很好的,因爲它支付了一些乘法,但避免了一些冗餘的劃分,而這在舊硬件上當然是非常昂貴的。 – Tommy 2013-02-16 05:30:01

+0

感謝您的澄清。我會在稍後嘗試。 – Nowibananatzki 2013-02-16 06:21:14