我正在寻找一种方法来同时渲染多个网格物体,这样我就不必为每个网格物体发出一个绘制调用。我在这里处理2D渲染,并且诸如正方形的典型对象可能只有两个三角形。但是,一个对象也可能非常复杂并且有数千个三角形。
现在每个对象都可以自行移动。从概念上讲,为每个“对象”设置VBO(或VBO / IBO对)是完全合理的:只要对象没有改变,我必须每帧上传到GPU的转换信息:位置向量和方向价值。或者,等效地,转换矩阵。
但是这种方法的问题在于1000个正方形物体的场景我需要1000个VBO和1000个IBO进行初始化,1000个绘制调用每帧设置1000套制服以渲染2000个三角形。
好。如果所有这些对象都是相同的,我可以用一个VBO / IBO来描述它们,设置一个统一缓冲区对象(或者可能是一个统一的数组更合适 - 我仍然需要学习如何使用它们)和转换数据它们中的每一个,并发出一个实例化绘制调用,让顶点着色器通过使用它接收的实例编号从UBO拉出转换数据。大。
我只想更进一步。我想做的事情相当于在非相同网格上实例化:我有1000个不同的对象,我很乐意在1000个单独的顶点/索引缓冲区对中描述,或者一个巨大的顶点/索引缓冲区对。我想在一次通话中将他们的转换数据发送到GPU。这只是让驱动程序/ GPU绑定或选择适当的顶点的问题。
可以这样做吗?可以在不使用SM4几何着色器的情况下完成吗?
更新:我刚想到了实现这一目标的潜在方法。我使用顶点属性作为我的“实例化”值,用于索引包含转换的UBO。这是这样做的吗?
答案 0 :(得分:0)
每个对象不需要一个VBO。只需将所有对象连接成一个单独的VBO或只是一小部分VBO。您可以在VBO中为gl*Pointer
函数的数据参数添加偏移量,或使用glDrawElementsBaseVertex
在绘图时添加偏移量。索引数组中只有4个indecies,而不是连接所有小对象的索引数组。如果你正在使用一些strip或fan原语,你可以设置一个带glPrimitiveRestartIndex
的特殊索引,当遇到它时会启动一个新的原语。
这样你只需要通过使用的材质设置以及整体转换和着色器参数(即纹理,着色器,着色器制服)来拆分渲染调用。