2013-12-09 78 views
0

我想在opengl中加載多個對象到vbo中。如果我希望能夠獨立移動這些對象,我應該爲每個對象使用網格還是應該將所有對象加載到單個網格?單個網格中有多個網格或多個對象?

而且在我的代碼我有...

LOC1 = glGetAttribLocation(shaderP, 「vertex_position」);

現在我明白,這將獲得我當前程序中的頂點位置,但如果我想加載另一個對象,我加載了網格,然後如何才能再次獲取頂點位置,但只有該網格?

回答

0

如果對不同的對象使用不同的緩衝區,它通常更清潔。按照 http://www.opengl.org/sdk/docs/man/xhtml/glGetAttribLocation.xml 這隻會返回指向數據位置的指針。你用這個將你的頂點信息綁定到程序中。渲染其他對象時,您將綁定到存儲其他頂點的vbo。

+0

好吧,但我應該使用一個網格爲我的所有對象或多個網格? – OneTwo

+0

如果您使用多個網格,它會更乾淨。 – Sorin

1

答案與往常一樣,「取決於」。每個對象具有一個「網格」(即一個緩衝區)可以說是「更清潔」,但它也可能更慢。每個對象一個緩衝區將使您更經常地綁定不同的緩衝區。微小的頂點緩衝區對象(幾十個頂點)和巨大的(數據千兆字節)一樣糟糕。您應該嘗試在

之間找到一個「合理」的東西

從3.2版本隨時可用glDrawElementsBaseVertex(也存在爲實例版本)將允許您從一個緩衝區中無縫地繪製多個對象或片段,而無需重新編寫重新編號索引,而不必切換緩衝區。

您應該最好(假設OpenGL 3.3可用性)完全不使用glGetAttribLocation,而是使用assign the attribute to a location使用佈局說明符。那樣的話你知道的位置,你不需要每次都問,而且你不必擔心會發生「奇怪的,意料之外的事情」。
如果在着色器中無法執行此操作,請改用glBindAttribLocation(自2.0版後可用)。它有點不舒服,但也是一樣的。你得到決定的位置,而不是要求它,並擔心編譯器希望沒有改變兩個不同着色器的順序。