Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在OpenGL中使用具有多个数组的单个ByteBuffer_Android_Opengl Es_Bytebuffer - Fatal编程技术网

Android 在OpenGL中使用具有多个数组的单个ByteBuffer

Android 在OpenGL中使用具有多个数组的单个ByteBuffer,android,opengl-es,bytebuffer,Android,Opengl Es,Bytebuffer,在我的应用程序中,我必须用OpenGL绘制多个元素,一些是三角形,另一些是线条。每当我要绘制一个新形状时,我都会将顶点放入multiplefloat[],将索引放入multipleshort[]。我还必须为每个新数组创建一个新的FloatBuffer、ShortBuffer和ByteBuffer,以使其工作。如何更有效地绘制多个元素?我正在考虑将所有顶点放入一个float[]中,并为每个元素创建一个新的short[],以删除多余的数组,但是是否可以使用一个FloatBuffer,ShortBuf

在我的应用程序中,我必须用OpenGL绘制多个元素,一些是三角形,另一些是线条。每当我要绘制一个新形状时,我都会将顶点放入multiple
float[]
,将索引放入multiple
short[]
。我还必须为每个新数组创建一个新的
FloatBuffer
ShortBuffer
ByteBuffer
,以使其工作。

如何更有效地绘制多个元素?我正在考虑将所有顶点放入一个
float[]
中,并为每个元素创建一个新的
short[]
,以删除多余的数组,但是是否可以使用一个
FloatBuffer
ShortBuffer
并将所有数组放入一个
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);

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的偏移参数指定数据在缓冲区对象中的起始位置


不过,这听起来像是在运行时生成自定义形状,因此您可以重复使用ByteBuffer并将每个形状存储在单独的缓冲区对象中,如上面的示例所示。

它工作得非常好!我必须在
glBindBuffer
glBufferData
以及调用
GL\u ARRAY\u BUFFER
GL\u STATIC\u DRAW
之前添加
,但除此之外,一切都完全按照我的要求运行。但奇怪的是,这是保存内存和CPU/GPU使用率的最有效方式吗?做某事的“最有效”方式在很大程度上取决于你想做什么。例如,如果您每帧创建一个ByteBuffer以将数据上载到图形卡,那么这将更加高效。要真正了解这一点,唯一的方法是针对您的特定目的使用不同的方法进行基准测试。我的目的是最初绘制一个大型数组或顶点和索引,但在活动的整个生命周期中不会发生任何变化。好的,所以在应用程序开始时,只需将所有顶点和索引数据加载到大型缓冲区对象中即可。不要每次绘制形状时都上载此数据。相反,可以使用glVertexPointer的偏移参数指定形状数据在缓冲区中的位置。这种方法非常有效。