Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL着色语言最佳实践 我在C++和Eclipse/Visual C++中编写了一个OpenGL引擎。总而言之,我的引擎有几个从典型的GameObject虚拟类派生的对象。在我的层次结构中,根据对象是否有子对象和父对象,有几个级别。例如,地形对象位于标高0中。从搅拌机装载的储罐位于1级等_Opengl - Fatal编程技术网

OpenGL着色语言最佳实践 我在C++和Eclipse/Visual C++中编写了一个OpenGL引擎。总而言之,我的引擎有几个从典型的GameObject虚拟类派生的对象。在我的层次结构中,根据对象是否有子对象和父对象,有几个级别。例如,地形对象位于标高0中。从搅拌机装载的储罐位于1级等

OpenGL着色语言最佳实践 我在C++和Eclipse/Visual C++中编写了一个OpenGL引擎。总而言之,我的引擎有几个从典型的GameObject虚拟类派生的对象。在我的层次结构中,根据对象是否有子对象和父对象,有几个级别。例如,地形对象位于标高0中。从搅拌机装载的储罐位于1级等,opengl,Opengl,问题是根据相应的着色器渲染每个对象的最佳实践是什么。如果我有一个由同一着色器程序渲染的对象列表,我应该渲染子规则之间的所有对象:glUseProgram(program_id)。。。glUseProgram(0),而不是更改每个对象的程序。即: for each object glUseProgram(object.program) ... glBindVertexArray(m_pVao->m_vaoHandle); for (GLuint i = 0; i < (m_

问题是根据相应的着色器渲染每个对象的最佳实践是什么。如果我有一个由同一着色器程序渲染的对象列表,我应该渲染子规则之间的所有对象: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)
...
glBindVertexArray(m_pVao->m_vaoHandle);
对于(GLuint i=0;i<(m_iNumIndex/3);i++)
{
偏移量=i*3;
GLD元素(GL_三角形、3、GL_无符号整数和m_索引[offset]);
}
glBindVertexArray(0);
或:

glUseProgram(object.program)
...
对于program.list中的每个对象
glBindVertexArray(object.m_pVao->m_vaoHandle);
对于(GLuint i=0;i<(m_iNumIndex/3);i++)
{
偏移量=i*3;
GLD元素(GL_三角形、3、GL_无符号整数和m_索引[offset]);
}
glBindVertexArray(0);
对不起,这是伪代码


对象可以存储在std::vector中,每个着色器都有一个对象列表。

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

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

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);