я написал obj загрузчик.Это очень просто, но я уверен, что это работает.Я проверил значения в файле и те, которые напечатаны загрузчиком, и они совпадают.Проблема возникает, когда я пытаюсь загрузить большой файл obj, такой как stanford dragon или Bunny.Чайник из Юты (3664 верт) работает отлично, однако дракон (50 тысяч верт) выглядит ужасно неправильно:
Как вы видите что-тоне так с драконом.Кажется, что только часть треугольников визуализируется.
PS Все модели были триангулированы.
Загрузка сетки:
void Mesh::load(float* buffer, unsigned int size, char fields, char target) {
unsigned int vbo;
glGenBuffers(1, &vbo);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer(target, fields, GL_FLOAT, false, sizeof(float) * fields, 0);
glBufferData(GL_ARRAY_BUFFER, size, buffer, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
vbos[target] = vbo;
}
void Mesh::loadIndices(void* buffer, unsigned int size) {
glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, buffer, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
и сетка:
mesh = new Mesh();
mesh->numIndices = indices.size();
mesh->load(positions, pos.size() * sizeof(float), 3, MESH_TARGET_POS);
mesh->loadIndices(ind, indices.size() * sizeof(unsigned int));
indices
и pos
std::vectors
, позиции и ind - это просто содержимое этих векторов, скопированных в выделенную память кучи (на случай, если это что-то изменит, но нет, это ничего не изменит).Метод load принимает указатель на данные, размер в байтах, поля в векторе (3-й вектор - 3 поля, 2-й вектор - 2 поля) и, наконец, целое число, указывающее, какой атрибут является этими данными (MESH_TARGET_POS
- атрибут 1, позиции вершин),
Этот код не имеет отношения (я считаю) к проблеме.Все модели с вершинами меньше 10k работают нормально, даже дракон в нижнем полигоне работает отлично.