2017-04-25 45 views
0

我想呈現兩個不同的頂點集合在另一個之上。現在,我的主循環自己正確渲染一個,而另一個正確時它本身正確,但當我同時調用兩個繪圖函數時,我看到一個空白窗口。爲什麼會發生這種情況?帶獨特着色器的OpenGL多重繪製調用給出空白屏幕

第一次繪製調用使用一個着色器,而第二次繪製調用使用不同的着色器。我不清楚中間的屏幕。

如果它使代碼更加清晰,我的着色器程序將存儲爲類變量,就像它們在我的程序中加載elseh後的紋理ID一樣。

這是我的主循環:

while (true) 
{ 
    // Clear the colorbuffer 
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    drawModel1(); // This works when drawModel2() is commented out 
    drawModel2(); // This works when drawModel1() is commented out 

    // Unbind buffer 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    // Swap the screen buffers 
    glfwSwapBuffers(_window); 
} 

drawModel1()功能呈現點:

void drawModel1() 
{ 
    // Use the image shader 
    _img_shader.use(); 

    // Feed the position data to the shader 
    glBindBuffer(GL_ARRAY_BUFFER, _img_pos_VBO); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); 
    glEnableVertexAttribArray(0); 

    // Feed the color data to the shader 
    glBindBuffer(GL_ARRAY_BUFFER, _img_color_VBO); 
    glVertexAttribPointer(1, 3, GL_UNSIGNED_BYTE, GL_TRUE, 3 * sizeof(GLubyte), (GLvoid*)0); 
    glEnableVertexAttribArray(1); 

    // Set the projection matrix in the vertex shader 
    GLuint projM = glGetUniformLocation(_img_shader.program(), "proj"); 
    glm::mat4 proj = _ndc * _persMat; 
    glUniformMatrix4fv(projM, 1, GL_TRUE, glm::value_ptr(proj)); 

    // Set the view matrix in the vertex shader 
    GLuint viewM = glGetUniformLocation(_img_shader.program(), "view"); 
    glUniformMatrix4fv(viewM, 1, GL_TRUE, glm::value_ptr(_viewMat)); 

    // Draw the points 
    glBindVertexArray(_img_VAO); 
    glDrawArrays(GL_POINTS, 0, _numImageVertices); 

    // Disable attributes 
    glDisableVertexAttribArray(0); 
    glDisableVertexAttribArray(1); 
} 

而且我drawModel2()功能使索引的三角形:

void drawModel2() 
{ 
    _model_shader.use(); 

    // Load the mesh texture 
    GLuint texID = _loaded_textures.at(mesh.tex_file()); 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, texID); 
    glUniform1i(glGetUniformLocation(_model_shader.program(), "texture_img"), 0); 

    // Set the proj matrix in the vertex shader 
    GLuint nvpmM = glGetUniformLocation(_model_shader.program(), "npvm"); 
    glm::mat4 npvm = _ndc * _persMat * _viewMat * mat; 
    glUniformMatrix4fv(nvpmM, 1, GL_FALSE, glm::value_ptr(npvm)); 

    // Feed the position data to the shader 
    glBindBuffer(GL_ARRAY_BUFFER, mesh.pos_VBO()); 
    GLuint pos_att = glGetAttribLocation(_model_shader.program(), "position"); 
    glEnableVertexAttribArray(pos_att); 
    glVertexAttribPointer(pos_att, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); 

    // Feed the texture coordinate data to the shader 
    glBindBuffer(GL_ARRAY_BUFFER, mesh.tex_VBO()); 
    GLuint tex_coord_att = glGetAttribLocation(_model_shader.program(), "texCoords"); 
    glEnableVertexAttribArray(tex_coord_att); 
    glVertexAttribPointer(tex_coord_att, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), (GLvoid*)0); 

    // Draw mesh 
    glBindVertexArray(mesh.VAO()); 
    glDrawElements(GL_TRIANGLES, mesh.numIndices(), GL_UNSIGNED_SHORT, (void*)0); 

    // Disable attributes 
    glDisableVertexAttribArray(0); 
    glDisableVertexAttribArray(1); 

    // Release resources 
    glBindTexture(GL_TEXTURE_2D, 0); 
} 
+0

如果在繪製調用開始時綁定頂點數組,而不是在繪製對象之前發生什麼? – Xirema

+0

@Xirema:那就是訣竅!怎麼來的? – marcman

回答

1

你需要綁定你的頂點數組在開始你的函數,而不是右t在繪製調用之前。頂點數組負責維護與給定對象[-type]關聯的狀態,並且將在該頂點數組上維護將設置狀態(如glVertexAttribPointerglEnableVertexAttribArray)的任何調用。你基本上用舊代碼做的事情是,你爲對象設置狀態,然後切換到完全不同的VAO,然後繪製,這意味着model1使用了model2的綁定和設置,反之亦然。除非他們有相同的規則和設置,否則他們都不可能畫出來。順便說一下,因爲VAO的商店狀態,需要在您的繪製調用中的唯一情況是繪製調用本身以及任何改變該幀的數據。所以你會考慮花一些時間重構代碼,因爲它看起來像大多數這些設置(如緩衝區綁定)不會逐幀更改。

+0

感謝您的解釋!對於初學者來說,這些文檔非常難以理解 – marcman

相關問題