You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Assimp加载模型在OpenGL渲染时网格部分缺失问题求助

问题原因及修复方案

  1. glDrawElements调用参数错误(核心缺面原因)
    glDrawElements的第二个参数是需要绘制的索引总数量,你当前传入的是面的数量this->faces.size(),每个面包含3个索引,这就导致你只绘制了三分之一的三角形,剩下的面都没有渲染。
    修复方法:将Mesh::Draw中的绘制调用修改为:

    glDrawElements(GL_TRIANGLES, this->faces.size() * 3, GL_UNSIGNED_INT, 0);
    
  2. VAO顶点属性状态错误
    VAO会存储每个顶点属性的启用/禁用状态,你在SetupMesh最后解绑VAO之前调用了glDisableVertexAttribArray,会导致后续绑定该VAO渲染时,所有顶点属性都是禁用状态,GPU无法读取顶点数据。
    修复方法:直接删除SetupMesh末尾的三行glDisableVertexAttribArray调用即可,不需要手动禁用属性,解绑VAO后后续的状态操作不会影响该VAO的存储内容。

  3. 法向量矩阵计算时机错误
    你在拼接完matModel的所有变换之前就计算了matInvTransposeModel,此时matModel还是单位矩阵,传入着色器的法向量矩阵完全没有包含模型的旋转、缩放变换,会导致法向量显示异常。
    修复方法:将matInvTransposeModel的计算移到matModel所有变换拼接完成之后:

    matModel = matModel * matScale;
    // 移到这里计算
    glm::mat4 matInvTransposeModel = glm::inverse(glm::transpose(matModel));
    
  4. Assimp导入配置检查建议
    检查你调用aiImportFile时传入的后处理标志,确保添加了aiProcess_Triangulate标志,强制将所有非三角面转换为三角形,避免因为面顶点数不等于3导致的索引缺失。如果开启了GL_CULL_FACE面剔除,可以临时关闭测试:如果关闭后所有面都正常显示,说明模型面绕序和OpenGL设置不一致,可以在导入时添加aiProcess_FlipWindingOrder标志调整,或者修改OpenGL的绕序/剔除面配置。

内容的提问来源于stack exchange,提问作者Kihz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 16:36:03