2010-09-17 61 views
4

我正在爲正在製作的遊戲構建一個小型3D引擎。我有我的基本排序:帶背面剔除的紋理三角形。然而深度分類被證明是一個難題。如何爲3D引擎Z排序三角形?

我通過平均構成三角形臉部的3點來計算臉部Z.較長的面有時與較小的面重疊,因爲它們具有較大的Z值,因此在深度排序的顯示列表中上升。

我該如何解決這個問題?如果我只能在編程時獲得一些實際的幫助,我肯定有深度的排序技術。我已經建立了渲染管線自己,所以我有機會獲得所有需要的數據 - 三角形,點,紋理,UV座標等

大教堂在3D節目

alt text

呈現大教堂呈現在我的3D引擎

alt text

回答

4

您需要細分您的三角形,使它們大致相同大小 - 無論您是自己排序還是使用z緩衝區。當然,除非z-buffer算法也爲你分割長的細三角形。

問題是,如果你有一些小的緊湊三角形和一些細長的三角形(例如),該算法會錯過對較長的三角形進行更頻繁的分類。如果使用三角形的中點,則會出現視點,在實際上如果真的落後,它將被視爲更緊湊的「前面」。採取這種自頂向下的觀點,其中+代表中點。

  o 

-+-   1 
-----+------ 2 
     -+- 3 

* 

*o大三角形尋找(2)可被解釋爲在小三角形(3),因此可以在它的上面畫出的前面之中。如果(2)被分割成3或4個較小的三角形,那麼z-緩衝將更多的時間工作。

+0

有沒有什麼辦法可以使Z排序例程偏向於考慮三角形區域,而不必拆分tris? – 2010-09-18 17:58:22

+2

不正確。這正是Z緩衝解決的問題。 Z緩衝是每個像素和獨立的多邊形大小(它發生在管道甚至知道)。 您描述的問題只適用於多邊形排序,或者如果您渲染非不透明的多邊形。精度問題與z緩衝有關,這裏有一個很好的介紹:http://www.sjbaker.org/steve/omniv/love_your_z_buffer.html – Justicle 2010-09-18 22:11:52

+0

Justicle說。此外,如果您需要z-排序(例如透明度),z-sort的計算有效方法是使用BSP樹。 – Kos 2011-11-21 18:08:46

4

你的選擇是要麼:

  1. 細分你的網格,使您可以 可靠每個多邊形進行排序(但 還有可怕的邊緣情況 ,你可能會或可能不會看到)。

  2. 使用Z-Buffer,這是所有 圖形硬件支持,基本上是 免費。

1

該複雜任何三角形的排序算法由下面的圖表示的角的情況下:

三角形的unsortable triangles

每個是在一個三角形的前面和後面的其它。爲了創建這個圖,我必須在inkscape中做一些非常簡單的技巧。

在3D中排列多邊形並不難,因此您在「前面」圖形中有一個循環。爲了解決這個問題,你的算法需要細分三角形來打破循環。

這是Z緩衝區如此流行的原因之一(並且它們很容易在硬件中加速)。