我正在用C++和Eclipse/Visual C++编写一个小的OpenGL引擎3D。总而言之,我的引擎有几个派生自典型GameObject虚拟类的对象。在我的层次结构中,有几个级别取决于对象是否有子对象和父对象。例如,地形对象位于级别0中。从搅拌机装载的水箱在第一层,等等。
问题是,根据相应的着色器渲染每个对象的最佳实践是什么。如果我有一个相同着色器程序的对象渲染器列表,我应该渲染子句之间的所有对象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中,并且每个着色器都有一个对象列表。
发布于 2016-07-18 23:27:48
执行成本最高的操作(绑定程序、着色器、纹理等)越少越好。因此,如果你的设计允许的话,在循环之外进行绑定并重用资源。这是您以后要做的最基本的性能优化之一。
https://stackoverflow.com/questions/38440208
复制相似问题