2016-09-08 5 views
-1

Весь мой проект можно найти по адресу 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 верна и не генерирует ошибок, что просто оставляет метод, который я использую для его отображения.

Если кто-то может мне помочь, я был бы очень признателен. В стороне, я хотел бы знать, как кредитовать тех, кто помогает.

ответ

0

Решено: использование (f1-f0) * SizeOf (INT) вместо nTriangles, который делится на 3, и добавить SizeOf (флоат) до размера вершин, передаваемых в

.
Смежные вопросы