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 を作成するにはどうすればよいですか?