如何优化VBO / IBO以最大化GPU缓存使用

时间:2015-07-05 19:31:31

标签: c++ opengl cuda thrust

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

我尝试过保存网格并以3种方式渲染它。

  1. 将一组原始三角形保存为连续的顶点数据数组。 我估计第一遍的大小,创建一个OpenGL VBO, 将其映射到CUDA并以下面的格式将顶点数据写入其中
  2. V0x, V0y, V0z, N0x, N0y, N0z, V1x, V1y, V1z, N1x, N1y, N1z, ...

    并使用glDrawArrays()绘制它。

      

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

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

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

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

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

        现在我获得的相同ISO-Value的相同数据集的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?

1 个答案:

答案 0 :(得分:1)

有两件事可以提供帮助:

  • 尝试通过将顶点粗略地按照您将绘制它们的顺序来优化数据缓存使用
  • 尝试优化post transform cache用法(有一个算法可以执行here,并且可以在网上找到实现)