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