私は OpenGL ES 2.0 でいくつかのオブジェクトを描画しています。各頂点にはいくつかの属性があり、最高のパフォーマンスを得るために推奨されているように、単一のバッファーにインターリーブして格納しています。これらのいくつか (position など) は float ( GLES20.GL_FLOAT
) で表されますが、色を渡しているので、色属性を 4 つの float コンポーネントとして渡すのはメモリの無駄なので、 を使用したいと思いますGLES20.GL_UNSIGNED_BYTE
。これらのうち 4 つが 1 つの 32 ビット フィールドにパックされます。ByteBuffer
ただし、これらをsに格納する簡単な方法がわかりません。たとえばGL_FLOAT
、次のように色を使用します。
void addVertex(float xpos, float ypos, int color) {
floatBuffer.put(xpos);
floatBuffer.put(ypos);
floatBuffer.put(Color.red(color) / 255f);
floatBuffer.put(Color.green(color) / 255f);
floatBuffer.put(Color.blue(color) / 255f);
floatBuffer.put(Color.alpha(color) / 255f);
}
これは機能しますが、32 で表現できる色を表現するために 128 ビットを使用しているため、パフォーマンスが低下します。したがって、私がやりたいことは、 a を作成し、それをByteBuffer
使用asFloatBuffer()
してエイリアスを作成し、格納されている型に適したものを使用することです。そのようです:
void addVertices() {
byteBuffer = ByteBuffer.allocateDirect(vertexCount * VERTEX_STRIDE).order(ByteOrder.nativeOrder());
floatBuffer = byteBuffer.asFloatBuffer();
for(Vertex v : vertices)
addVertex(v.x, v.y, v.color);
}
void addVertex(float xpos, float ypos, int color) {
floatBuffer.put(xpos);
floatBuffer.put(ypos);
byteBuffer.put(Color.red(color));
byteBuffer.put(Color.green(color));
byteBuffer.put(Color.blue(color));
byteBuffer.put(Color.alpha(color)); }
ただし、 の基になるストレージを共有するasFloatBuffer()
を作成しますが、独自の位置インデックスを維持するため、これは機能しません。何かを保存する前に、手動で位置を追跡し、それぞれを更新する必要がありますが、これは醜いです。FloatBuffer
ByteBuffer
属性を別々のバッファーに分割することもできますが、その場合のパフォーマンスの低下はおそらく利益を上回ります。
エレガントで効率的な方法でこれを行う方法についてのアイデアはありますか?