2016-07-18 142 views
1

我在C++和Eclipse/Visual C++中編寫了一個OpenGL Engine 3D。總的來說,我的引擎有幾個從典型的GameObject虛擬類派生的對象。在我的層次結構中,有幾個層次取決於對象是否有孩子和父母。例如,地形對象的級別爲0.從攪拌機加載的水槽位於水平1等等OpenGL着色語言最佳實踐

問題是根據相應的着色器渲染每個對象的最佳做法是什麼。如果我有一個由同一着色器程序渲染的對象列表,我應該在所有對象之間渲染所有對象VAO:glUseProgram(program_id)... glUseProgram(0),而不是更改每個對象的程序。即:

for each object 
glUseProgram(object.program) 
    ... 
    glBindVertexArray(m_pVao->m_vaoHandle); 
    for (GLuint i = 0; i < (m_iNumIndex/3); i++) 
    { 
    offset = i * 3; 
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &m_Index[offset]); 
    } 
glBindVertexArray(0); 

或者:

glUseProgram(object.program) 
    ... 
    for each object in program.list 
    glBindVertexArray(object.m_pVao->m_vaoHandle); 
    for (GLuint i = 0; i < (m_iNumIndex/3); i++) 
    { 
     offset = i * 3; 
     glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &m_Index[offset]); 
    } 
glBindVertexArray(0); 

對不起僞僞。

對象可以存儲在std :: vector中,每個着色器都有一個對象列表。

回答

0

儘可能少地執行代價最高的操作(綁定程序,着色器,紋理等)。因此,如果您的設計允許,請在循環之外進行綁定並重用資源。無論如何,這是您最後要做的最基本的性能優化之一。