1

我正在寻找一种同时渲染多个网格的方法,这样我就不必为每个网格发出绘制调用。我在这里处理的是 2D 渲染,一个典型的对象,比如一个正方形,里面可能只有两个三角形。但是,一个对象也可能非常复杂,并且有数千个三角形。

现在每个对象都可以自行移动。从概念上讲,为每个“对象”设置一个 VBO(或 VBO/IBO 对)是完全合理的:只要对象不变,我每帧都需要上传到 GPU 的只是变换信息:一个位置向量和一个方向值。或者,等效地,一个变换矩阵。

但是这种方法的问题在于,对于 1000 个方形对象的场景,我需要初始化 1000 个 VBO 和 1000 个 IBO,并且 1000 个绘制调用每帧设置 1000 套制服以渲染 2000 个三角形。

好的。如果所有这些对象都相同,我可以有一个 VBO/IBO 来描述它们,设置一个统一缓冲区对象(或者统一数组更合适——我仍然需要学习如何使用这些)和转换数据它们中的每一个,并发出一个实例化绘制调用,让顶点着色器通过使用它接收到的实例编号从 UBO 中提取转换数据。伟大的。

我只想更进一步。我想做相当于在不相同的网格上实例化的事情:我有 1000 个不同的对象,我很乐意在 1000 个单独的顶点/索引缓冲区对或一对巨大的顶点/索引缓冲区中描述它们。我想一次性将他们的转换数据发送到 GPU。只需让驱动程序/GPU 绑定或选择正确的顶点即可。

这可以做到吗?可以在不使用 SM4 几何着色器的情况下完成吗?

更新:我只是想到了一种潜在的方法来实现这一点。我使用顶点属性作为我的“实例化”值,用它来索引包含转换的 UBO。这是这样做的方法吗?

4

1 回答 1

0

每个对象不需要一个 VBO。只需将所有对象连接到一个 VBO 或一小组 VBO 中。您可以在该 VBO 中寻址,或者向gl*Pointer函数的数据参数添加偏移量,或者使用glDrawElementsBaseVertex在绘图时添加偏移量。连接所有小对象的索引数组,而不是索引数组中只有 4 个索引。如果您正在使用一些条形或扇形原语,您可以设置一个特殊的索引glPrimitiveRestartIndex,当遇到该索引时将启动一个新的原语。

这样,您只需要通过使用的材质设置以及整体转换和着色器参数(即纹理、着色器、着色器制服)来拆分渲染调用。

于 2012-03-03T12:00:40.433 回答