1

私は 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()を作成しますが、独自の位置インデックスを維持するため、これは機能しません。何かを保存する前に、手動で位置を追跡し、それぞれを更新する必要がありますが、これは醜いです。FloatBufferByteBuffer

属性を別々のバッファーに分割することもできますが、その場合のパフォーマンスの低下はおそらく利益を上回ります。

エレガントで効率的な方法でこれを行う方法についてのアイデアはありますか?

4

2 に答える 2

1

ByteBufferbyteマシンに依存しない方法で、他のデータ型をバッファに入れるために使用できる追加のメソッドがあります。したがって、 を でラップする代わりにByteBuffer、を直接FloatBuffer使用し、 を使用して値を追加します。ByteBufferputFloat()float

void addVertex(float xpos, float ypos, int color) {
    byteBuffer.putFloat(xpos);
    byteBuffer.putFloat(ypos);
    byteBuffer.put((byte)Color.red(color));
    byteBuffer.put((byte)Color.green(color));
    byteBuffer.put((byte)Color.blue(color));
    byteBuffer.put((byte)Color.alpha(color));     
}
于 2013-08-29T01:37:12.413 に答える