1

OpenGL でレンダリングするための頂点と要素を含むメモリ マップト ファイルを読み込もうとしています。ファイルは iPhone アプリに正しく読み込まれますが、Android で同じことを行う方法がわかりません。私は ByteBuffer、FloatBuffer、および IntBuffer と格闘してきましたが、それらの動作の 1 つの側面に困惑しています。

次のコードは、長さの読み取り、頂点データの FloatBuffer の設定、頂点データの後に来る別の長さの読み取り、要素データの ShortBuffer の設定を試みます。

int lenVerts = data.asIntBuffer().get();
data.position(data.position() + 4);

verts = data.asFloatBuffer();
data.position(data.position() + lenVerts);

IntBuffer ib = data.asIntBuffer();
int lenElems = ib.get();
data.position(data.position() + 4);

elems = data.asShortBuffer();
data.position(data.position() + lenElems);

ドキュメントの私の解釈に基づいて、asIntBuffer呼び出しは、現在の位置から始まり、バッファーの最後までのバイトにバッファーを返す必要があります。つまり、 を呼び出してスキップした頂点データを無視する必要がありdata.position(data.position() + lenVerts)ます。

問題は、これを実行していないように見えることです。に渡す値に関係なく、 へdata.position(...)の呼び出しはasIntBuffer常に、基になる ByteBuffer 全体にバッファーを返します。lenVerts == lenElemsこれは、 (つまり、頂点と要素のデータのサイズが異なっていても、同じ値が 2 回読み取られる) ということと、data.capacity() == 4*ib.capacity()(つまり、ByteBuffer には、IntBuffer が持つ整数の 4 倍のバイトがある) という点に注意することによって、二重に確認されます。 .

私は何か間違ったことをしていますか?ドキュメントを間違って解釈しましたか?

基礎となる ByteBuffer の一部のみによってサポートされる XxxBuffer を作成するにはどうすればよいですか?

4

1 に答える 1

0

バッファを引数として使用する他のメソッドによって Buffer.position() が無視されることに気付くまで、この問題に数時間を費やしました。私の回避策は、必要なバイトだけを保持する新しいバッファーを作成することです。

int pos = 100;
Buffer myBuffer; // old buffer containing ALL data
byte[] tmpBuf = new byte[myBuffer.capacity()-pos];
myBuffer.position(pos);
myBuffer.get(tmpBuf);

// Create new buffer:
Buffer fixedBuffer = ByteBuffer.wrap(tmpBuf); // new buffer containing only required data
于 2012-03-13T16:03:48.700 に答える