2009-01-28 57 views
11

這是我一直在尋找的東西,但我還沒有找到任何具體的信息或好的例子。例如,我有一堆未連接的物體(例如三角形條)。什麼是渲染這些的有效方式?OpenGL:渲染一批幾何圖形的有效方法?

我聽說過把幾個對象放在一個VBO中以減少openGL調用,但還沒有看到如何做到這一點的適當例子。我也看到與這個想法相矛盾的帖子。所以現在,我大多隻是困惑。

+0

我剛剛實施了一個方法,概述在http://craiggiles.wordpress.com/2009/08/03/opengl-es-batch-rendering-on-the-iphone/,它運作良好。 – RandomEtc 2011-06-21 00:08:55

回答

15

首先,你應該一直使用VBO。適用於小型和大型物體。

然後,第二個問題是「如何將幾個單獨的對象組合成一個大對象?」 - 所以要減少必須進行的OpenGL調用的次數。通常,可以合併使用相同紋理,材質設置和着色器的對象。例如。如果你有大量相同的箱子躺在周圍,將它們合併成幾個更大的「箱子樁」可能是有意義的。

如果一個對象是一個三角形列表,那麼組合很容易 - 只需從源列表中創建一個大三角形列表。如果一個物體是一個三角形條帶,那麼你必須使用「退化三角形」來連接條帶(如果它不能被表示成單個條帶,這對於單個物體也是非常有用的優化)。

「退化三角形」是一個具有兩個或三個相同頂點索引的三角形。圖形硬件可以識別它們並非常快地跳過它們。

所以,如果你有,例如兩個帶有一個三角形的條帶,總共六個頂點。

條的原三角形指數將是:

1) 0, 1, 2 
2) 0, 1, 2 

現在您加入所有頂點在一起,所以你最終與6個頂點。

1) 0, 1, 2 (unchanged) 
2) 3, 4, 5 

現在你有一個頂點數組,但仍然是兩個單獨的條。有通過插入退化三角形加入他們的行列:

1) 0, 1, 2, 2, 2, 3, 4, 5 

(我覺得上面的是正確的,但並沒有實際驗證)

的想法是這樣的:與上面條,顯卡將繪製三角形這些頂點:

0, 1, 2 
1, 2, 2 <- degenerate! won't be drawn 
2, 2, 2 <- degenerate! won't be drawn 
2, 2, 3 <- degenerate! won't be drawn 
3, 4, 5 

在一般的情況下,你可能已插入基於原始帶材長度的兩個或三個退化三角形,使三角形繞組仍然正確。

+0

爲什麼你不能編譯一個使用GL_TRIANGLE_STRIP的顯示列表? – aib 2009-01-29 11:34:19

1

調查glDrawElements(),這是實現你想要的一個好方法。請注意,如果您的數據每幀更改,性能可能會下降,因爲您需要更新數據的相關部分,這意味着將其複製到顯卡的內存中。對於靜態數據,這是非常快的。

+0

甚至更​​好;你現在可以使用glMultiDrawIndirect():) – MattMatt 2016-06-16 08:15:01