0

私のアプリケーションでは、OpenGL で複数の要素を描画する必要があります。一部は三角形で、他はライン ストリップです。新しい形状を描画するときはいつでも、頂点を複数float[]に、インデックスを複数に配置しています。また、新しい,をshort[]作成し、新しい配列ごとに機能させる必要があります。複数の要素をより効率的に描画するにはどうすればよいですか? すべての頂点を 1 つにまとめ、要素ごとに新しい を作成して余分な配列を削除することを考えていましたが、 one を使用して、すべての配列を次のように 1 つにまとめることは可能ですか。FloatBufferShortBufferByteBuffer

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 の数を減らすことが目的の場合は、すべてに使用される 1 つの大きな 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 );

頂点とインデックス データが静的な場合、すべてのシェイプの頂点データを 1 つのバッファー オブジェクトに入れ、すべてのインデックス データを別のバッファー オブジェクトに入れ、glV​​ertexPointer と glIndexPointer のオフセット パラメーターを使用して、バッファー オブジェクト内のデータの開始位置を指定します。

ただし、実行時にカスタム形状を生成するように聞こえるので、ByteBuffer を再利用して、上記のサンプルのように各形状を個別のバッファー オブジェクトに格納することができます。

于 2013-01-10T02:22:55.783 に答える