¿Por qué mi iluminación no funciona correctamente? ¿Mis normales están en mal estado?

Soy relativamente nuevo en OpenGL y estoy tratando de dibujar un model 3D (cargado desde un file 3ds usando lib3ds) usando OpenGL con iluminación, pero aproximadamente la mitad está dibujada en negro.

modelo

Configuro la luz como tal:

glEnable(GL_LIGHTING); glShadeModel(GL_SMOOTH); GLfloat ambientColor[] = {0.2f, 0.2f, 0.2f, 1.0f}; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientColor); glEnable(GL_LIGHT0); GLfloat lightColor0[] = {1.0f, 1.0f, 1.0f, 1.0f}; GLfloat lightPos0[] = {4.0f, 0.0f, 8.0f, 0.0f}; glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor0); glLightfv(GL_LIGHT0, GL_POSITION, lightPos0); 

El model está en un VBO y dibujado usando glDrawArrays . Las normales están en un VBO separado, y las normales se calculan usando lib3ds_mesh_calculate_vertex_normals :

 std::vector<std::array<float, 3>> normals; for (std::size_t i = 0; i < model->nmeshes; ++i) { auto& mesh = *model->meshes[i]; std::vector<float[3]> vertex_normals(mesh.nfaces * 3); lib3ds_mesh_calculate_vertex_normals(&mesh, vertex_normals.data()); for (std::size_t j = 0; j < mesh.nfaces; ++j) { auto& face = mesh.faces[j]; normals.push_back(make_array(vertex_normals[j])); } } glBindBuffer(GL_ARRAY_BUFFER, normal_vbo_); glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(decltype(normals)::value_type), normals.data(), GL_STATIC_DRAW); 

El problema no son los vértices; el model se dibuja correctamente cuando se dibuja como una estructura alámbrica. También arreglé las normales en Blender usando el control N. ¿Cual podría ser el problema? ¿Debo almacenar las normales en un order diferente?

Como al presionar Control-N se eliminó el problema, las normales que tu model tenía antes de presionar Control-N no eran correctas. Así que sí, tus normales estaban en mal estado, pero tu código de cliente probablemente esté bien.