使用Assimp加载模型在OpenGL渲染时网格部分缺失问题求助
问题原因及修复方案
glDrawElements调用参数错误(核心缺面原因)glDrawElements的第二个参数是需要绘制的索引总数量,你当前传入的是面的数量this->faces.size(),每个面包含3个索引,这就导致你只绘制了三分之一的三角形,剩下的面都没有渲染。
修复方法:将Mesh::Draw中的绘制调用修改为:glDrawElements(GL_TRIANGLES, this->faces.size() * 3, GL_UNSIGNED_INT, 0);VAO顶点属性状态错误
VAO会存储每个顶点属性的启用/禁用状态,你在SetupMesh最后解绑VAO之前调用了glDisableVertexAttribArray,会导致后续绑定该VAO渲染时,所有顶点属性都是禁用状态,GPU无法读取顶点数据。
修复方法:直接删除SetupMesh末尾的三行glDisableVertexAttribArray调用即可,不需要手动禁用属性,解绑VAO后后续的状态操作不会影响该VAO的存储内容。法向量矩阵计算时机错误
你在拼接完matModel的所有变换之前就计算了matInvTransposeModel,此时matModel还是单位矩阵,传入着色器的法向量矩阵完全没有包含模型的旋转、缩放变换,会导致法向量显示异常。
修复方法:将matInvTransposeModel的计算移到matModel所有变换拼接完成之后:matModel = matModel * matScale; // 移到这里计算 glm::mat4 matInvTransposeModel = glm::inverse(glm::transpose(matModel));Assimp导入配置检查建议
检查你调用aiImportFile时传入的后处理标志,确保添加了aiProcess_Triangulate标志,强制将所有非三角面转换为三角形,避免因为面顶点数不等于3导致的索引缺失。如果开启了GL_CULL_FACE面剔除,可以临时关闭测试:如果关闭后所有面都正常显示,说明模型面绕序和OpenGL设置不一致,可以在导入时添加aiProcess_FlipWindingOrder标志调整,或者修改OpenGL的绕序/剔除面配置。
内容的提问来源于stack exchange,提问作者Kihz

