2016-07-18 95 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

尽可能少地执行代价最高的操作(绑定程序,着色器,纹理等)。因此,如果您的设计允许,请在循环之外进行绑定并重用资源。无论如何,这是您最后要做的最基本的性能优化之一。