C++ Assimp opengl加载问题

C++ Assimp opengl加载问题,c++,opengl,3d,assimp,C++,Opengl,3d,Assimp,我正在尝试加载并渲染从blender导出到3ds格式的3D模型 我正在使用Assimp加载模型,并使用OpenGL(GLEW)进行渲染。出于某种原因。在某些模型中,仅渲染模型的一部分。 对于某些情况,可以通过在blender中选择所有对象并单击“连接”来修复此问题。但对其他人来说,这并不能解决问题 下面是我用来加载模型的代码: (这里所有的“数组”都是std::vector) 然后在主渲染循环中执行此操作 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BU

我正在尝试加载并渲染从blender导出到3ds格式的3D模型

我正在使用Assimp加载模型,并使用OpenGL(GLEW)进行渲染。出于某种原因。在某些模型中,仅渲染模型的一部分。 对于某些情况,可以通过在blender中选择所有对象并单击“连接”来修复此问题。但对其他人来说,这并不能解决问题

下面是我用来加载模型的代码: (这里所有的“数组”都是std::vector)

然后在主渲染循环中执行此操作

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    glEnable(GL_CULL_FACE);

    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), (void*)0);

    glEnableVertexAttribArray(1);
    glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 2*sizeof(float), (void*)0);

    camera.Update();
    mvp = camera.getProjection() * camera.getView() * Model;
    shader.SetUniformLocationMatrix4fv("MVP", &mvp[0][0]);
    glBindTexture(GL_TEXTURE_2D, akm_tex);
    glUseProgram(shader);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexbuffer);

    glDrawElements(
            GL_TRIANGLES,      // mode
            indexArray.size(),    // count
            GL_UNSIGNED_INT,   // type
            (void*)0           // element array buffer offset
    );

    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(2);
以下是我的程序中模型的外观:

这是它在搅拌机里的样子

您没有将节点的变换应用到正在渲染的顶点缓冲区。每个assimp节点存储一个局部变换,该变换需要应用于其所有指定的网格

可以在着色器中引入统一变量来表示顶点的全局变换。在渲染过程中,需要将局部变换与全局变换相乘,并通过此统一矩阵应用它


或者,您可以只使用glPushMAtrix和glPopMatrix并应用当前节点的局部变换,因为您可以看到

缺少VAO。在核心配置文件OpenGL中,渲染时必须使用VAO。@BDL在这种情况下不会显示任何内容。VAO可能绑定在未显示的代码中。感谢您的输入。据我所知,顶点缓冲区对象取代了顶点数组对象,但如果我错了,请详细说明。我也是opengl的新手,所以如果你能解释一下核心配置文件的含义,那会很有帮助。再次感谢
    glGenBuffers(1, &vertexbuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glBufferData(GL_ARRAY_BUFFER, vertexArray.size() * sizeof(float), vertexArray.data(), GL_STATIC_DRAW);

    glGenBuffers(1, &indexbuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexbuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexArray.size() * sizeof(unsigned int), indexArray.data(), GL_STATIC_DRAW);

    glGenBuffers(1, &uvbuffer);
    glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
    glBufferData(GL_ARRAY_BUFFER, uvArray.size() * sizeof(float), uvArray.data(), GL_STATIC_DRAW);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    glEnable(GL_CULL_FACE);

    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), (void*)0);

    glEnableVertexAttribArray(1);
    glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 2*sizeof(float), (void*)0);

    camera.Update();
    mvp = camera.getProjection() * camera.getView() * Model;
    shader.SetUniformLocationMatrix4fv("MVP", &mvp[0][0]);
    glBindTexture(GL_TEXTURE_2D, akm_tex);
    glUseProgram(shader);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexbuffer);

    glDrawElements(
            GL_TRIANGLES,      // mode
            indexArray.size(),    // count
            GL_UNSIGNED_INT,   // type
            (void*)0           // element array buffer offset
    );

    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(2);