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中,每个着色器都有一个对象列表。