如何优化VBO/IBO以最大限度地利用GPU缓存

How to Optimizing a VBO/IBO to maximize GPU cache usage

本文关键字:最大限度 缓存 GPU IBO 何优化 优化 VBO      更新时间:2023-10-16

我正在使用CUDA上运行的Marching Cubes算法从体积数据生成网格。

我已经尝试过保存网格并用三种方式进行渲染。

  1. 将一组粗糙的三角形保存为顶点数据的连续数组。我估计如果第一次通过创建OpenGL VBO,将其映射到CUDA,并以以下格式将顶点数据写入其中

V0x, V0y, V0z, N0x, N0y, N0z, V1x, V1y, V1z, N1x, N1y, N1z, ...

并用CCD_ 2绘制。

VBO中的冗余顶点、每个多维数据集的冗余顶点,无索引。

  1. 取步骤1中的网格,使用thrust::sort()thrust::unique()删除冗余顶点,并使用thrust::lower_bound()计算索引。将结果保存到映射到CUDA的OpenGL VBO/IBO中。用CCD_ 6绘制模型

VBO中没有冗余顶点,生成的索引。

  1. 为每个立方体生成一个唯一的顶点列表,将它们与它们的索引一起存储在VBO中,在IBO中形成三角形。使用glDrawElements()渲染

VBO中的冗余顶点,每个多维数据集的唯一顶点,每个立方体的生成索引

现在,对于相同ISO值的同一数据集,我得到的FPS是

Method 1 : 92  FPS, 30,647,016 Verts,          0 Indices
Method 2 : 122 FPS,  6,578,066 Verts, 30,647,016 Indices
Method 3 : 140 FPS, 20,349,880 Verts, 30,647,016 Indices

即使方法2产生的顶点数量最少,FPS也很低。我相信这是因为索引的顺序可以最大限度地减少GPU缓存的使用。方法3的索引顺序获得更高的GPU缓存使用率,因此FPS也更高。

如何修改/修改方法2以获得更高的FPS?

有两件事可以帮助:

  • 尝试通过将顶点大致按绘制顺序放置来优化数据缓存的使用
  • 尝试优化转换后缓存的使用(这里有一种算法可以做到这一点,实现可能可以在网上找到(