0

在我的应用程序中,我必须使用 OpenGL 绘制多个元素,有些是三角形,有些是线条。每当我要绘制新形状时,我都会将我的顶点放入多个float[],并将我的索引放入多个。short[]我还必须为每个新数组创建一个新的FloatBuffer,以使其工作。我怎样才能更有效地绘制多个元素?我正在考虑将所有顶点放入一个单一的并为每个元素创建一个新的以删除多余的数组,但是是否可以使用一个,并将所有数组放入一个单一的,例如:ShortBufferByteBuffer

float[]short[]FloatBufferShortBufferByteBuffer

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);
4

1 回答 1

1

glBufferData 将数据从缓冲区发送到显卡的内存。在调用之后,您可以使用 ByteBuffer 做任何您想做的事情,它不会影响已经发送的数据。

因此,如果您的目标是减少您创建的 ByteBuffer 的数量,您可以只创建一个用于所有内容的大型 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 的偏移参数来指定数据在缓冲区对象中的开始位置。

It sounds like you generate custom shapes at runtime though, so you could just re-use the ByteBuffer and store each shape in a separate buffer object like the sample above.

于 2013-01-10T02:22:55.783 回答