首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL着色语言最佳实践

OpenGL着色语言最佳实践
EN

Stack Overflow用户
提问于 2016-07-18 23:09:43
回答 1查看 69关注 0票数 1

我正在用C++和Eclipse/Visual C++编写一个小的OpenGL引擎3D。总而言之,我的引擎有几个派生自典型GameObject虚拟类的对象。在我的层次结构中,有几个级别取决于对象是否有子对象和父对象。例如,地形对象位于级别0中。从搅拌机装载的水箱在第一层,等等。

问题是,根据相应的着色器渲染每个对象的最佳实践是什么。如果我有一个相同着色器程序的对象渲染器列表,我应该渲染子句之间的所有对象VAO: glUseProgram(program_id) ...glUseProgram(0),而不是更改每个对象的程序。即:

代码语言:javascript
复制
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);

或者:

代码语言:javascript
复制
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中,并且每个着色器都有一个对象列表。

EN

回答 1

Stack Overflow用户

发布于 2016-07-18 23:27:48

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38440208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档