为什么我的照明不能正常工作? 我的法线是乱了吗?

我相对较新的OpenGL,我试图用OpenGL绘制3D模型(使用lib3ds从3ds文件加载),但其中约一半是用黑色绘制的。

模型

我设置了这样的灯光:

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); 

该模型在VBO中,并使用glDrawArrays绘制。 法线在一个单独的VBO中,法线使用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); 

问题不在于顶点; 绘制线框时,模型绘制正确。 我也使用控制 N在Blender中修正了法线。 可能是什么问题呢? 我应该以不同的顺序存储法线吗?

由于按下Control-N删除了您的问题,因此在您按下Control-N之前,您的模型的法线不正确。 所以是的,你的法线很乱,但是你的客户端代码很可能很好。