2011-08-08 128 views
7

(我指定了2.1,因爲我的筆記本電腦不會超過這個版本。自從3.x開始,我可能會這樣做,並且着重介紹了着色器)。OpenGL 2.1中的頂點緩衝區對象

感謝維基百科:http://en.wikipedia.org/wiki/Vertex_Buffer_Object我開始明白使用VBO有多簡單(我仍然對IBO沒有正面評價?)。到目前爲止我所理解的是,使用它們的主要原因是由於數據現在存儲在視頻內存中而獲得的性能提升。

我想知道的是我應該如何在實際環境中使用它們。例如,我見過的所有東西都設置了一個頂點緩衝區對象,並繪製了一個三角形或一個立方體等。如果我想繪製2個或更多,該怎麼辦?我是否爲每個要繪製的實體設置一個新的VBO?或者我神奇地追加到一些靜態VBO,我很早就設置了?

+0

完全不相關的評論:如何看待維也納組織而不是關於IBO,因爲它們更簡單,如果你瞭解前者。而在實際應用中,您通常會使用'glDrawElements'而不是'glDrawArrays'。 –

+0

@Christian Rau:我可能沒有把我的問題弄清楚,我很好奇我是否需要創建多個VBO而不是一個全局的VBO。 –

+0

我明白(並回答)你的問題。就像Ken說的那樣,IBO與維也納國際組織並沒有那麼不同或更難。 –

回答

5

這取決於,因爲問題相當廣泛。

使用一個VBO作爲頂點屬性,一個用於每個模型/對象/實體/網格的索引是直接的方法。您可以將所有模型存儲在一個VBO中,因此您不必經常綁定緩衝區,但是當這些模型不是那麼靜態時,這會帶來其他問題。此外,您可以爲每個對象使用多個VBO,可能是一個用於動態數據,一個用於靜態數據,或者一個用於幾何數據(位置...),另一個用於材料相關數據(texCoords ...)。

每個對象使用一個VBO可能具有(dis)優點,以及使用單個巨大的VBO可能不是那麼好的想法。它只取決於具體的應用以及這些概念如何適合它。但是,一開始,簡單的一個 - 每個對象的VBO方法並不是一個壞主意。每個三角形都不要使用一個VBO;)

+0

我能在每個Quad上使用一個VBO和IBO嗎?我正在設置一個精靈對象。 –

+0

@Storm您可以使用每個四邊形的一個VBO,但是每個繪製調用只能渲染一個四邊形,這可能適用於您的精靈對象(僅包含一個四邊形)。但是如果你有許多完全相同的精靈(就像在一個粒子系統中一樣),這當然就是一個例子,你應該把所有的精靈/粒子打包成一個VBO,這樣你就可以一次渲染所有的精靈。就像我說的那樣,它取決於具體的應用,粒子系統肯定是有利於VBO的方法之一。 –

+0

這是有道理的。有沒有辦法爲非相似的精靈批量精靈繪製調用?我認爲XNA用他們的SpriteBatch來做這件事。 –

2

它應該非常簡單 - 只需向VBO添加更多數據即可。因此,例如,如果要渲染3個三角形而不是1個,請確保將9個頂點發送到glBufferData。然後,爲了渲染所有這些,請使用調用glDrawArrays(GL_TRIANGLES, 0, 9);它確實應該很簡單。

然而,關於IBO的一點是,它們與VBO真的沒有多大區別,我真的會習慣使用它們。這實際上是使用維也納國際組織的實際方式。由於多個三角形通常意味着覆蓋相同的表面(例如,一個立方體需要十二個三角形),所以僅使用VBO會導致指定頂點數據的重複。通過使用索引緩衝區,事情更加高效,因爲任何重複都從VBO中移除。我發現了this,它提供了一個簡單的從VBO轉移到VBO/IBO的例子,並給出了一個很好的解釋。

+0

這是一個有用的教程謝謝。 –

+0

+1鏈接到Eddy Luten的書,我真的很喜歡這個項目。 –

+0

是的,我今天剛剛找到了這本書,他的簡潔寫作風格給我留下了深刻的印象。 –

相關問題