在OpenGL中使用单个ByteBuffer和多个数组

时间:2013-01-07 15:54:28

标签: android opengl-es bytebuffer

在我的应用程序中,我不得不使用OpenGL绘制多个元素,一些是三角形,另一些是Line Strips。每当我要绘制一个新形状时,我将我的顶点放入多个float[]并将我的索引放入多个short[]。我还必须为每个新数组创建一个新的FloatBufferShortBufferByteBuffer,以使其正常工作。

如何更有效地绘制多个元素?我正在考虑将所有顶点放入单个float[]并为每个元素创建一个新的short[]以删除多余的数组,但是是否可以使用一个FloatBuffer,{{1将所有数组放入单个ShortBuffer中,如下所示:

ByteBuffer

1 个答案:

答案 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并将每个形状存储在一个单独的缓冲区对象中,就像上面的示例一样。