Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 使用ASIMP加载OBJ模型时的视觉瑕疵_Opengl_Assimp - Fatal编程技术网

Opengl 使用ASIMP加载OBJ模型时的视觉瑕疵

Opengl 使用ASIMP加载OBJ模型时的视觉瑕疵,opengl,assimp,Opengl,Assimp,我正在尝试将Assimp加载程序集成到我的框架中。一切都渲染得很好,但在我正在渲染的蜘蛛模型中,它的尖牙并没有按预期绘制(请参见下图) 以下是相关的代码片段: //Storing the Indices for (unsigned int t = 0; t < mesh->mNumFaces; ++t) { aiFace* face = &mesh->mFaces[t]; memcpy(&faceArray[index], face->m

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

以下是相关的代码片段:

//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);
}
//存储索引
对于(无符号整数t=0;tmNumFaces;++t){
aiFace*face=&mesh->mFaces[t];
memcpy(&faceArray[index],face->mIndices,3*sizeof(unsigned int));
指数+=3;
}
//存储顶点
对于(无符号整数t=0;tmNumVertices;++t){
aiVector3D顶点;
如果(网格->HasPositions()){
顶点=网格->垂直度[t];
memcpy(&vertexArray[index],&vertex,3*sizeof(float));
}
指数+=3;
}
//渲染模块
void模型::helperDraw(GLuint vertexBufferID、GLuint indexBufferID、GLuint textureID)
{
闪烁指数化;
glBindBuffer(GL_数组_BUFFER,vertexBufferID);
glBindBuffer(GL_元素_数组_缓冲区,indexBufferID);
glGetBufferParameteriv(GL_元素数组缓冲区、GL_缓冲区大小和索引大小);
glBindTexture(GL_TEXTURE_2D,textureID);
gld元素(GL_三角形,indexSize/sizeof(GLuint),GL_无符号,0);
}

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

您的代码没有明显的问题。这些渲染伪影的一个可能原因是,加载的OBJ模型有一些面是三角形,而有些面不是三角形。您正在将所有对象渲染为
GL_三角形
,但OBJ格式可以将面指定为四边形、三角形条带、三角形,甚至其他更奇特的对象,如面片


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

您确定所有的面都是三角形吗?在一般的OBJ文件中,面可以是具有任意数量顶点的多边形。是的,事实上,就像@RetoKoradi所说的,面实际上可能是四边形或三条带。加载模型时,将
aiProcess\u Triangulate
标志传递给assimp,以确保所有面都是三角化的。之前,该标志是aiProcessPreset\u TargetRealtime\u,质量更改为aiProcess\u Triangulate,它起作用了我正在尝试使用教程[并将动画添加到我的代码中。无法找出如何找到4个骨骼+权重,引导/关联动画中的特定顶点。@ppu,我认为应该问一个“真实”问题,以备您需要进一步帮助。此外,您可能希望尝试GameDev部分:“真实”问题[