OpenGL着色语言最佳实践

时间:2016-07-18 15:09:43

标签: opengl

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

1 个答案:

答案 0 :(得分:0)

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