我在C ++和Eclipse / Visual C ++中编写了一些OpenGL Engine 3D。概括地说,我的引擎有几个派生自典型GameObject虚拟类的对象。在我的层次结构中,有几个级别取决于对象是否具有子级和父级。例如,地形物体处于0级。从搅拌机装载的水箱位于1级,等等。
问题是根据相应的着色器渲染每个对象的最佳做法是什么。如果我有一个由同一着色器程序的对象渲染器列表,我应该在clausule之间渲染所有对象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 :(得分:0)
尽可能少地进行成本最高的操作(绑定程序,着色器,纹理等)。因此,如果您的设计允许,请在循环外部进行绑定并重用资源。这是你以后要做的最基本的性能优化之一。