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