OpenGL 4.5基元重启与基础索引

从我如何理解https://www.opengl.org/wiki/Vertex_Rendering中解释的两种技术(原始重启和基本索引),他们都做同样的事情。 简单地说,它们允许我将很多网格物体放入同一个缓冲区,然后再将它们渲染成多个网格物体。 我的理解是正确的吗?

如果我的理解确实是正确的,那么我的下一个问题就是它们中的任何一个如何与间接渲染和多重渲染一起工作。
让我们来使用下面的例子:我有多个网格,它们放在一个实体中。 多个实体放到一个场景中。 在场景中,实体属性(如位置,纹理等)可能会更改。 什么是最好的方式来渲染他们的performance虎钳? 通过使用glMultiDrawElementsBaseVertex()(是否有间接版本?)或通过设置glPrimitiveRestartIndex(),然后使用glMultiDrawElementsIndirect()?
如果没有前者的间接变式, 后者不应该是更好的select吗?

当然,也许有更好的办法。 如果是这样,我真的很想听到:)

对于你的第一个问题是,你的理解是正确的。

其次,我认为做Multidraw*Indirect (没有glPrimitiveRestartIndex​() )会更好的performance(最优化)。 要记住的主要事情是,你所做的每个OpenGL调用都是调用OpenGL驱动程序。 所以你打电话的次数越多,驱动程序的开销就越多。

这个演示文稿 ( 幻灯片 )和代码@ github是一个很好的地方,可以看看如何减less驱动开销。

我将举一个简短的例子,说明你必须做什么,但是你可以通过我提供的链接进入实现的更多细节。


基本上,你填充你的缓冲区( GL_ARRAY_BUFFERGL_ELEMENT_ARRAY_BUFFER ),并计算你的偏移到每个模型。

然后以任何forms填充绘图命令

 typedef struct { GLuint _count; GLuint _instanceCount; GLuint _first; GLuint _baseInstance; } DAICmd; 

GL_ARRAY_BUFFER ( 链接如何渲染 )和

 typedef struct { GLuint _count; GLuint _instanceCount; GLuint _first; GLuint _baseVertex; GLuint _baseInstance; } DEICmd; 

GL_ELEMENT_ARRAY_BUFFER ( 链接如何呈现 )。

每个命令进入一个GL_DRAW_INDIRECT_BUFFER ,你的额外属性(matrix变换,纹理句柄等)进入一个GL_SHADER_STORAGE_BUFFER

您可以通过询问OpenGL来生成它们(比如当您执行实例渲染)时访问每个属性,或者您可以创建一个ID缓冲区。

完成这一切之后,您可以执行一次OpenGL调用,绘制您所批处理的所有内容。