2013-01-07 62 views
0

在我的應用程序中,我必須用OpenGL繪製多個元素,其中一些是三角形,另一些是線條。無論何時我要繪製新形狀,我都會將頂點放入多個float[],並將我的索引放入多個short[]。我還必須爲每個新陣列創建新的FloatBufferShortBufferByteBuffer以使其工作。

我怎樣才能更有效地繪製多個元素?我正在考慮將所有頂點放到一個單獨的float[]中,併爲每個元素創建一個新的short[]以刪除多餘的陣列,但是可以使用一個FloatBufferShortBuffer,並將所有陣列放入一個單獨的ByteBuffer,例如:在OpenGL中使用一個具有多個數組的ByteBuffer

float[] vertices = { -3, -3, -3, 2, 3, 0, 2, -1, 0, 0, 5, 2, 3, 1 }; 
short[] indItemA = { 0, 1, 2, 0, 2, 3 }; 
short[] indItemB = { 4, 5, 6 }; 

FloatBuffer fBuff; 
ShortBuffer sBuff; 

ByteBuffer bBuff = ByteBuffer.allocateDirect(vertices.length * 4); 
fbBuff.order(ByteOrder.nativeOrder()); 

fBuff = bBuff.asFloatBuffer(); 
fBuff.put(vertices); 
fBuff.position(0); 

sBuff = bBuff.asShortBuffer(); 
sBuff.put(indItemA); 
sBuff.position(0); 

sBuff.put(indItemB); 
sBuff.position(0); 

回答

1

glBufferData將數據從緩衝區發送到圖形卡的內存。在該調用之後,您可以使用ByteBuffer執行任何操作,並且不會影響已發送的數據。

因此,如果您的目標是減少您創建的ByteBuffers的數量,您可以創建一個用於一切的大型ByteBuffer。只需重置緩衝區的指針,寫入數據,將其發送到顯卡並重復。

// Do this once 
ByteBuffer bBuff = ByteBuffer.allocateDirect(someBigNumber); 
bBuff.order(ByteOrder.nativeOrder()); 
FloatBuffer fBuff = bBuff.asFloatBuffer(); 
ShortBuffer sBuff = bBuff.asFloatBuffer(); 

// Do this for each shape 
fBuff.position(0); 
fBuff.put(vertices); 
fBuff.position(0); 

glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); 
glBufferData(GL_ARRAY_BUFFER, vertices.length * 4, fBuff, GL_STATIC_DRAW); 

sBuff.position(0); 
sBuff.put(indices); 
sBuff.position(0); 

glBindBuffer(GL_ARRAY_BUFFER, indexbuffer); 
glBufferData(GL_ARRAY_BUFFER, indices.length * 2, sBuff, GL_STATIC_DRAW); 

如果你的頂點和索引數據是靜態的,你可以只是把頂點數據,每捏成一個緩衝對象和所有的索引數據到另一個然後使用glVertexPointer和glIndexPointer的偏移參數來指定在數據開始的緩衝區對象。

聽起來您在運行時會生成自定義形狀,因此您可以重新使用ByteBuffer並將每個形狀存儲在單獨的緩衝區對象中,如上面的示例。

+0

它完美的作品!我必須在每個'glBindBuffer'和'glBufferData'之前加入'GLES11.',並且調用'GL_ARRAY_BUFFER'和'GL_STATIC_DRAW',但除此之外,一切都按照我所希望的那樣工作。只是好奇,這是保存內存和CPU/GPU使用率的最有效方法嗎? – Adam

+0

做某事的「最有效」方式很大程度上取決於正在做什麼。例如,如果您每創建一個字節緩衝區以將數據上傳到圖形卡,那麼效率就會更高。真正知道的唯一方法就是用不同的方法爲你的特定目的做基準。 –

+0

我的目的是最初繪製一個大的數組或頂點和索引,但在整個活動的整個過程中不會改變。 – Adam

相關問題