Я пытаюсь прочитать отображенный в памяти файл, содержащий вершины и элементы для рендеринга в OpenGL.Файл корректно загружается в приложение для iPhone, но я просто не могу понять, как сделать то же самое в Android.Я боролся с ByteBuffer, FloatBuffer и IntBuffer, и один аспект их поведения сбивает меня с толку.
Следующий код пытается прочитать длину, настроить 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
(т.е. одно и то же значение читается дважды, даже если размеры данных вершин и элементов различаются), а также что data.capacity() == 4*ib.capacity()
(т. Е. ByteBuffer имеет в четыре раза больше байтовпоскольку IntBuffer имеет целые числа).
Я что-то не так делаю?Правильно ли я истолковал документы?
Как создать XxxBuffer, который поддерживается только частью базового ByteBuffer?