2015-12-14 60 views
0

现在我正在写一个基本的OpenGL封装使用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(); 

Renderer.cpp

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); 
    } 
} 

我使用下面的(静态)库:GLEWGLFWSOIL2

我也是用的只有头库:GLM

在构建静态库,我保证他们都使用Visual建Studio的v140平台工具集。我在Debug和Release中都构建了每个静态库。 Debug版本全部使用/ MDd CRT构建,Release版本使用/ MD CRT构建。

我所有的代码和项目配置文件都是开源的位置:Github

任何帮助,不胜感激!谢谢。

Debug Mode/Release Mode

+0

编辑在一张[MCVE]。 – genpfault

回答

3

问题:

我觉得很傻。我放了一堆glError检查,并且设法将问题查明到我的函数中,从而生成立方体网格,我依赖于RVO。但是对于视觉工作室RVO显然只能在发布模式而不是调试模式下完成。所以我的网格的析构函数一旦被创建就被调用,在它被渲染之前从GPU内存中移除它。

解决办法:

始终始终始终遵循Rule of 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; 
} 
相关问题