【发布时间】:2016-03-19 10:00:51
【问题描述】:
现在我正在使用 Visual Studio 2015 编写一个基本的 OpenGL 包装器,我遇到了一个非常奇怪的现象,即当我在调试模式下构建和运行时,我的立方体没有被渲染。然而,在发布模式下,一切似乎都完美呈现。
值得注意的是,程序确实在调试模式下运行,它确实用我设置的绿色清除了屏幕。所以看起来OpenGL在一定程度上是有效的。问题是它没有像在发布模式下那样渲染我的立方体网格。我通过调试确认我的资产(着色器和图像文件)在调试模式下正确加载,所以这似乎不是问题。
在代码方面,以下是程序的有趣部分:
在Main.cpp:
renderer.Clear(0.2f, 0.3f, 0.3f, 1.0f);
for(GLuint i = 0; i < 10; ++i) {
renderer.PushMatrix();
renderer.Translate(cubePositions[i].x, cubePositions[i].y, cubePositions[i].z);
renderer.Rotate(20.0f * i, glm::vec3(1.0f, 0.3f, 0.5f));
renderer.Render(cube);
renderer.PopMatrix();
}
window.SwapBuffers();
void Renderer::updateMVP() const {
glm::mat4 _proj = camera.GetProjectionMatrix();
glm::mat4 _view = camera.GetViewMatrix();
glm::mat4 _model = model.top();
glUniformMatrix4fv(glGetUniformLocation(shader.GetProgram(), "projection"), 1, GL_FALSE, glm::value_ptr(_proj));
glUniformMatrix4fv(glGetUniformLocation(shader.GetProgram(), "view"), 1, GL_FALSE, glm::value_ptr(_view));
glUniformMatrix4fv(glGetUniformLocation(shader.GetProgram(), "model"), 1, GL_FALSE, glm::value_ptr(_model));
}
void Renderer::Clear(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) const {
glClearColor(red, green, blue, alpha);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
void Renderer::Render(const Mesh& mesh) const {
shader.Use();
updateMVP();
mesh.Render(this->shader);
}
在Mesh.cpp:
void Mesh::Render(const Shader& shader) const {
assert(this->VAO);
for (GLuint i = 0; i < this->textures.size(); ++i) {
shader.BindTexture(this->textures[i], i);
}
glBindVertexArray(this->VAO);
glDrawElements(GL_TRIANGLES, this->indices.size(), GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
for (GLuint i = 0; i < this->textures.size(); ++i) {
shader.UnbindTexture(i);
}
}
我也在使用仅标头库:GLM
在构建静态库时,我确保它们都是使用 Visual Studio 的 v140 平台工具集构建的。我在 Debug 和 Release 中都构建了每个静态库。 Debug 版本都是使用 /MDd CRT 构建的,Release 版本是使用 /MD CRT 构建的。
我所有的代码和项目配置文件都在这里开源:Github
非常感谢任何帮助!谢谢。
【问题讨论】:
标签: c++ debugging opengl visual-studio-2015