我正在寻找一种同时渲染多个网格的方法,这样我就不必为每个网格发出绘制调用。我在这里处理的是 2D 渲染,一个典型的对象,比如一个正方形,里面可能只有两个三角形。但是,一个对象也可能非常复杂,并且有数千个三角形。
现在每个对象都可以自行移动。从概念上讲,为每个“对象”设置一个 VBO(或 VBO/IBO 对)是完全合理的:只要对象不变,我每帧都需要上传到 GPU 的只是变换信息:一个位置向量和一个方向值。或者,等效地,一个变换矩阵。
但是这种方法的问题在于,对于 1000 个方形对象的场景,我需要初始化 1000 个 VBO 和 1000 个 IBO,并且 1000 个绘制调用每帧设置 1000 套制服以渲染 2000 个三角形。
好的。如果所有这些对象都相同,我可以有一个 VBO/IBO 来描述它们,设置一个统一缓冲区对象(或者统一数组更合适——我仍然需要学习如何使用这些)和转换数据它们中的每一个,并发出一个实例化绘制调用,让顶点着色器通过使用它接收到的实例编号从 UBO 中提取转换数据。伟大的。
我只想更进一步。我想做相当于在不相同的网格上实例化的事情:我有 1000 个不同的对象,我很乐意在 1000 个单独的顶点/索引缓冲区对或一对巨大的顶点/索引缓冲区中描述它们。我想一次性将他们的转换数据发送到 GPU。只需让驱动程序/GPU 绑定或选择正确的顶点即可。
这可以做到吗?可以在不使用 SM4 几何着色器的情况下完成吗?
更新:我只是想到了一种潜在的方法来实现这一点。我使用顶点属性作为我的“实例化”值,用它来索引包含转换的 UBO。这是这样做的方法吗?