Весь мой проект можно найти по адресу http://github.com/jep-dev/FOGL. Он ожидает среду Linux и требования, найденные в readme.Почему OpenGL не отображает эту модель при загрузке с OBJ?
Я написал наивный Wavefront OBJ-загрузчик и попытался нарисовать результаты, используя OpenGL. Я также создал сетку, которая успешно отображается как сфера в центре экрана. Я могу сериализовать сетку как OBJ и загрузить ее успешно (см. Test/src/model.cpp) - однако загруженный OBJ не будет отображаться. Я не могу придумать, что еще нужно устранить, но метод, который я использую для отображения OBJ, за исключением того, что этот метод почти идентичен способу отображения сетки.
Отображение сетки:
using namespace Model;
mesh_t mesh(150, 150,
[](float s, float t, std::vector<float> &vertices) {
using namespace Math;
auto theta = s*M_PI*2, phi = t*M_PI;
vertices.emplace_back(cos(theta)*sin(phi)); // X
vertices.emplace_back(sin(theta)*sin(phi)); // Y
vertices.emplace_back(cos(phi)); // Z
});
glGenBuffers(1, &viewer.ids[view::e_id_vbuf]);
glBindBuffer(GL_ARRAY_BUFFER, viewer.ids[view::e_id_vbuf]);
glBufferData(GL_ARRAY_BUFFER, mesh.vertices.size() * sizeof(float),
(void*) &mesh.vertices[0], GL_STATIC_DRAW);
glGenBuffers(1, &viewer.ids[view::e_id_fbuf]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,
viewer.ids[view::e_id_fbuf]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, mesh.faces.size() * sizeof(int),
(void*) &mesh.faces[0], GL_STATIC_DRAW);
viewer.nTriangles = mesh.faces.size()/3;
Отображение OBJ:
using namespace Model;
obj_t object;
auto status = obj_t::load(this -> mpath, object);
if(status != obj_t::e_ok) {
errors.push_back("The model failed to load.");
return alive = false;
}
// TODO Use more than first range of each obj type
if(object.v_beg.size() == 0) {
errors.push_back("The loaded model does not contain vertices.");
return alive = false;
} else {
auto v0 = object.v_beg[0], v1 = object.v_end[0];
glGenBuffers(1, &viewer.ids[view::e_id_vbuf]);
glBindBuffer(GL_ARRAY_BUFFER, viewer.ids[view::e_id_vbuf]);
glBufferData(GL_ARRAY_BUFFER, v1-v0,
(void*)(&object.floats[v0]), GL_STATIC_DRAW);
}
if(object.vn_beg.size() != 0) {
auto vn0 = object.vn_beg[0], vn1 = object.vn_end[0];
glGenBuffers(1, &viewer.ids[view::e_id_vnbuf]);
glBindBuffer(GL_ARRAY_BUFFER, viewer.ids[view::e_id_vnbuf]);
glBufferData(GL_ARRAY_BUFFER, (vn1-vn0)*sizeof(float),
(void*)(&object.floats[vn0]), GL_STATIC_DRAW);
}
glGenBuffers(1, &viewer.ids[view::e_id_fbuf]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,
viewer.ids[view::e_id_fbuf]);
int f0, f1;
if(object.f0_beg.size() != 0) {
f0 = object.f0_beg[0];
f1 = object.f0_end[0];
} else if(object.f1_beg.size() != 0) {
f0 = object.f1_beg[0];
f1 = object.f1_end[0];
} else if(object.f2_beg.size() != 0) {
f0 = object.f2_beg[0];
f1 = object.f2_end[0];
} else if(object.f3_beg.size() != 0) {
f0 = object.f3_beg[0];
f1 = object.f3_end[0];
} else {
errors.push_back("The loaded model does not contain faces.");
return alive = false;
}
viewer.nTriangles = (f1-f0)/3;
glBufferData(GL_ELEMENT_ARRAY_BUFFER, viewer.nTriangles*sizeof(int),
(void*)(&object.ints[f0]), GL_STATIC_DRAW);
Дополнительный код для извлечения диапазона, как OBJ файлы могут содержать несмежные данные, однако модель я использую является share/sphere.obj, которая смежна. Модель не содержит нормалей, как и сетка. Я также проверил метод извлечения диапазона, это, похоже, не является проблемой. Опять же, все, что я тестировал, говорит о том, что моя загрузка OBJ верна и не генерирует ошибок, что просто оставляет метод, который я использую для его отображения.
Если кто-то может мне помочь, я был бы очень признателен. В стороне, я хотел бы знать, как кредитовать тех, кто помогает.