在我的应用程序中,我不得不使用OpenGL绘制多个元素,一些是三角形,另一些是Line Strips。每当我要绘制一个新形状时,我将我的顶点放入多个float[]
并将我的索引放入多个short[]
。我还必须为每个新数组创建一个新的FloatBuffer
,ShortBuffer
和ByteBuffer
,以使其正常工作。
如何更有效地绘制多个元素?我正在考虑将所有顶点放入单个float[]
并为每个元素创建一个新的short[]
以删除多余的数组,但是是否可以使用一个FloatBuffer
,{{1将所有数组放入单个ShortBuffer
中,如下所示:
ByteBuffer
答案 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的offset参数指定缓冲区对象中的位置数据开始。
听起来你在运行时会生成自定义形状,所以你可以重新使用ByteBuffer并将每个形状存储在一个单独的缓冲区对象中,就像上面的示例一样。