2011-05-31 86 views
8

我是新來的opengl編程。我目前正在製作洞穴形成的動畫。我有一組沿着z軸的軸的輪廓的座標。我的計劃是從這個數據中創建一個3d網格,並且我已經決定使用TRIANGLE_STRIPS。我這樣做的方式是,我已經建立了多個條是這樣的:OpenGL:3D網格和法線的三角形問題

 
11----12 5------6 
| /| | /| 
|/ | |/ | 
9-----10 3------4 
| /| | /| 
|/ | |/ | 
7------8 1------2 

我的問題是:

  1. 這是做正確的方式?因爲現在我有法線問題。我想使用GL_SMOOTH陰影,並據我所知我需要計算頂點的法線?但在我的cas頂點10和3是相同的,所以會有兩個法線?那是問題嗎?還有什麼其他的方式來創建多個帶?

  2. 是否有任何其他方式來創建多個帶?或者帶條解決方案可能不是最好的解決方案?

  3. 另一個問題是,這些條帶的長度不等。有些比其他人短。 謝謝您的幫助:)

回答

2

首先,在您的圖片,對角線實際上翻轉,如果數字代表頂點的順序(但是這是一個輕微的錯誤陳述)。

  1. 這是剝離一個或多或少均勻的頂點網格的最簡單和最充分的方法。你是對的,因爲10和3需要相同的法線,所以你需要給他們相同的法線才能正確點亮。在這種情況下,索引是你的朋友。只需使用3和10的單個頂點(使用相應的法線)並使用索引的三角形條,其中索引3和10引用相同的頂點。這是解決頂點模糊的標準方法。如果你不知道我的意思,一般深入研究OpenGL和3D編程,特別是頂點和索引數組。

  2. 對於規則的網格,條通常是一個好主意,因爲它們可以很容易地構建。對於更復雜的網格,現在不再需要它了,因爲減少繪製調用次數通常更重要。

  3. 與三角形的總數相比,它們應該至少有一個合理的長度,否則繪製單條的開銷超過了稍微快一點的頂點處理所節省的時間,但實際數量與實施高度相關。無論如何,您應該使用頂點數組/緩衝區,如果您關心性能,請遠離開始/結束位置。

實際上,通過引入未渲染的退化三角形(以減少繪製調用次數),可以將多個條帶合併爲一條。你的例子可以呈現爲以下單個條帶:

1,2,3,4,5,6,6,7,7,8,9,10,11,12

但同樣,記住答案。這些條應具有合理的大小,以便退化三角形不會超過實際三角形。

6

首先,不要使用三角形條。對於舊硬件來說這是舊概念。使用簡單的索引三角列表。這很容易(起初),速度更快。 對你的問題:

1)每個頂點都有一個正常的。它與位置一樣獨特而重要。如果兩個頂點具有不同的位置,它們將是不同的頂點。法線同樣適用:有些頂點的位置相同,但法線不同。但它們是不同的頂點。想想如何離開球體的頂點與立方體的頂點不同。

2)使用列表(glDrawElements)。不要使用條。有一些最佳的方法可以將這些列表排序進行緩存,nvidia和ati在其開發人員部分中提供了大量示例代碼。

3)別擔心。一個好的網格將具有大致相等的面積三角形。索引經過排序,大部分時間點擊頂點緩存(通常至少16個條目)。 Strips是一種優化2入口頂點緩存的方法。

+1

是:不要使用三角形條。三角帶不是特別的「舊硬件」,或者更慢,但是使用它們會遇到很大的麻煩。 +1使用簡單的索引三角形。頂點緩存通常是24,重要的是什麼。 – Calvin1602 2011-06-01 18:56:55