【问题标题】:Visual artifacts when loading OBJ model with Assimp使用 Assimp 加载 OBJ 模型时的视觉伪影
【发布时间】:2014-08-27 06:55:57
【问题描述】:

我正在尝试将 Assimp 加载器集成到我的框架中。一切都渲染得很好,但是在我正在渲染的这个蜘蛛模型中,它的尖牙没有按预期绘制(见下图)。

下面是相关代码sn-p:

//Storing the Indices
for (unsigned int t = 0; t < mesh->mNumFaces; ++t) {
    aiFace* face = &mesh->mFaces[t];
    memcpy(&faceArray[index], face->mIndices, 3*sizeof(unsigned int));
    index += 3;
}

//Storing the Vertices
for (unsigned int t = 0; t < mesh->mNumVertices; ++t) {
    aiVector3D vertex ;
    if (mesh->HasPositions()) {
        vertex = mesh->mVertices[t];
        memcpy(&vertexArray[index], &vertex,3*sizeof(float));
    }
    index += 3;          
}

//Render module
void model::helperDraw(GLuint vertexBufferID, GLuint indexBufferID, GLuint textureID)
{
    GLint indexSize;
    glBindBuffer(GL_ARRAY_BUFFER,vertexBufferID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,indexBufferID);
    glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &indexSize);
    glBindTexture( GL_TEXTURE_2D, textureID);
    glDrawElements(GL_TRIANGLES, indexSize/sizeof(GLuint), GL_UNSIGNED_INT, 0);
}

我的代码可能有什么问题?

【问题讨论】:

  • 你确定你所有的脸都是三角形吗?在一般的 OBJ 文件中,面可以是具有任意数量顶点的多边形。
  • 是的,确实,就像@RetoKoradi 所说的那样,面部实际上可能是四边形或三边形。在加载模型时将aiProcess_Triangulate 标志传递给assimp,以确保所有面都被三角剖分。
  • 之前的标志是 aiProcessPreset_TargetRealtime_Quality 更改为 aiProcess_Triangulate 并且它起作用了

标签: opengl assimp


【解决方案1】:

您的代码没有明显错误。这些渲染伪影的一个可能原因是您加载的 OBJ 模型有一些面是三角形的,而一些面不是。您将所有内容渲染为GL_TRIANGLES,但 OBJ 格式可以将面指定为四边形、三角形条形、三角形,甚至还有其他更奇特的东西,如补丁。

Assimp 有一个网格三角剖分工具,可以让您在处理这些多格式网格文件(例如 OBJ)时更加轻松。尝试将标志 aiProcess_Triangulate 传递给导入器的加载方法,或者如果您将后处理作为单独的步骤,甚至传递给后处理方法。这可能会解决问题。

【讨论】:

猜你喜欢
  • 2016-12-28
  • 2014-02-20
  • 2019-06-08
  • 2018-05-11
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多