![](/img/trans.png)
[英]Qt renders this SVG correctly in “debug” mode but not in “release”
[英]OpenGL renders in release mode but not debug mode
现在,我正在使用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);
}
}
我正在使用以下(静态)库: GLEW , GLFW , SOIL2
我也在使用仅标头库: GLM
构建静态库时,我确保它们都是使用Visual Studio的v140平台工具集构建的。 我在Debug和Release中都构建了每个静态库。 调试版本都是使用/ MDd CRT构建的,而发行版本则是使用/ MDCRT构建的。
我所有的代码和项目配置文件都在此处开源: Github
任何帮助是极大的赞赏! 谢谢。
问题:
我觉得很傻。 我放置了一堆glError检查,然后设法将问题精确定位到生成依赖RVO的多维数据集网格物体的函数中。 但是,对于Visual Studio,RVO显然仅在发布模式下完成,而不在调试模式下完成。 因此,我的网格物体的析构函数一经创建便被调用,并在渲染之前将其从GPU内存中删除。
解决方案:
始终始终遵循5规则 。 解决方案是简单地将复制构造函数/赋值运算符添加到我的Mesh和Texture类中,以防止对其托管资源的重新分配。
网格破坏器:
Mesh::~Mesh() {
glDeleteVertexArrays(1, &this->VAO);
glDeleteBuffers(1, &this->VBO);
glDeleteBuffers(1, &this->EBO);
}
多维数据集创建功能:
sr::Mesh createCube() {
sr::Mesh mesh;
mesh.AddTexture(sr::Texture("wood_container.jpg", "Texture1"));
mesh.AddTexture(sr::Texture("awesome_face.png", "Texture2"));
glm::vec3 p1(-0.5f, -0.5f, 0.5f);
glm::vec3 p2( 0.5f, -0.5f, 0.5f);
glm::vec3 p3( 0.5f, 0.5f, 0.5f);
glm::vec3 p4(-0.5f, 0.5f, 0.5f);
glm::vec3 p5( 0.5f, -0.5f, -0.5f);
glm::vec3 p6(-0.5f, -0.5f, -0.5f);
glm::vec3 p7(-0.5f, 0.5f, -0.5f);
glm::vec3 p8( 0.5f, 0.5f, -0.5f);
glm::vec2 tc00(0.0f, 0.0f);
glm::vec2 tc01(0.0f, 1.0f);
glm::vec2 tc10(1.0f, 0.0f);
glm::vec2 tc11(1.0f, 1.0f);
glm::vec3 norm;
GLuint v1, v2, v3, v4, v5, v6, v7, v8;
// Front
norm = glm::vec3(0.0f, 0.0f, 1.0f);
v1 = mesh.AddVertex(p1, norm, tc00);
v2 = mesh.AddVertex(p2, norm, tc10);
v3 = mesh.AddVertex(p3, norm, tc11);
v4 = mesh.AddVertex(p4, norm, tc01);
mesh.AddTriangle(v1, v2, v3);
mesh.AddTriangle(v1, v3, v4);
// Back
norm = glm::vec3(0.0f, 0.0f, -1.0f);
v5 = mesh.AddVertex(p5, norm, tc00);
v6 = mesh.AddVertex(p6, norm, tc10);
v7 = mesh.AddVertex(p7, norm, tc11);
v8 = mesh.AddVertex(p8, norm, tc01);
mesh.AddTriangle(v5, v6, v7);
mesh.AddTriangle(v5, v7, v8);
// Right
norm = glm::vec3(1.0f, 0.0f, 0.0f);
v2 = mesh.AddVertex(p2, norm, tc00);
v5 = mesh.AddVertex(p5, norm, tc10);
v8 = mesh.AddVertex(p8, norm, tc11);
v3 = mesh.AddVertex(p3, norm, tc01);
mesh.AddTriangle(v2, v5, v8);
mesh.AddTriangle(v2, v8, v3);
// Left
norm = glm::vec3(-1.0f, 0.0f, 0.0f);
v6 = mesh.AddVertex(p6, norm, tc00);
v1 = mesh.AddVertex(p1, norm, tc10);
v4 = mesh.AddVertex(p4, norm, tc11);
v7 = mesh.AddVertex(p7, norm, tc01);
mesh.AddTriangle(v6, v1, v4);
mesh.AddTriangle(v6, v4, v7);
// Top
norm = glm::vec3(0.0f, 1.0f, 0.0f);
v4 = mesh.AddVertex(p4, norm, tc00);
v3 = mesh.AddVertex(p3, norm, tc10);
v8 = mesh.AddVertex(p8, norm, tc11);
v7 = mesh.AddVertex(p7, norm, tc01);
mesh.AddTriangle(v4, v3, v8);
mesh.AddTriangle(v4, v8, v7);
// Bottom
norm = glm::vec3(0.0f, -1.0f, 0.0f);
v6 = mesh.AddVertex(p6, norm, tc00);
v5 = mesh.AddVertex(p5, norm, tc10);
v2 = mesh.AddVertex(p2, norm, tc11);
v1 = mesh.AddVertex(p1, norm, tc01);
mesh.AddTriangle(v6, v5, v2);
mesh.AddTriangle(v6, v2, v1);
mesh.Build();
return mesh;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.