Правильная настройка буфферов OpenGL по данным GLTF 2.0 файла, а также их отрисовка
У меня есть проблема связанная с правильной настройкой буфферов OpenGL, а так же понятием как их отрисоовать. Я использую библиотеку TinyGLTF
. Я инициализирую буффер так:
glBufferStorage(GL_ARRAY_BUFFER, buffer.data.size(), buffer.data.data(), 0)
А потом пытаюсь сказать OpenGL как эти данные хранятся. В данный момент я заполняю только данные о позиции. Я делаю это вот так:
count = accessor.count; // count это переменная класса типа int
type = accessor.componentType;
int byteStride = accessor.ByteStride(bview); // bview это bufferView
int size = accessor.type;
glVertexAttribPointer(0, size, type, GL_FALSE, byteStride, (GLvoid*)(&bview.byteOffset+accessor.byteOffset));
glEnableVertexAttribArray(0);
И тут появляется проблема, при отрисовке glDrawArrays(GL_TRIANGLES, 0, count);
у меня пустой экран, но OpenGL не сыпет ошибками (у меня реализован автоматический debug output). Но стоит в вызове glVertexAttribPoiner
заменить byteStride на 32 как у меня появляются треугольники, правда они расположены не правильно. Из этого у меня появилось несколько теорий:
- Я не правильно храню данные в буфере и указываю не правильное смещение
- Я получаю не правильный byteStride
- Это и 1, и 2 варианты
И на последок, я правильно создаю буфферы. У меня присутствуют вызовы glGenBuffers
и glGenVertexArrays
. А так же я получаю буферы следующим образом:
// index - это индекс нода, который я получаю извне и он точно ссылается на
// существующий Node из массива, а также model это тип tinygltf::Model*
tinygltf::Node node = model->nodes[index];
tinygltf::Mesh &mesh = model->meshes[node.mesh];
tinygltf::Primitive &prim = mesh.primitives[0];
tinygltf::Accessor &access = model->accessors[prim.attributes["POSITION"]];
tinygltf::BufferView &bview = model->bufferViews[access.bufferView];
tinygltf::Buffer &buff = model->buffers[bview.buffer];
И у меня есть ещё вопросы:
- Как получить и задать GL_ELEMENT_ARRAY_BUFFER в случае его присутствия
- И как правильно вызывать
glDrawElements