2015-12-14 99 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; 
} 
相關問題