我正在使用运行在CUDA上的Marching Cubes算法从体积数据中生成网格。
我已经尝试了三种保存和渲染网格的方法。
- 将一组粗略的三角形保存为顶点数据的连续数组。我估计第一次通过的大小,创建一个OpenGL VBO,将其映射到CUDA并以以下格式将顶点数据写入其中:
V0x,V0y,V0z,N0x,N0y,N0z,V1x,V1y,V1z,N1x,N1y,N1z,...
并使用glDrawArrays()
绘制它。
VBO中的冗余顶点,每个立方体的冗余顶点,没有索引。
- 从步骤1中获取网格,使用
thrust::sort()
和thrust::unique()
去除冗余顶点,使用thrust::lower_bound()
计算索引。将结果保存到映射到CUDA的OpenGL VBO / IBO中。使用glDrawElements()
绘制模型。
VBO中没有冗余顶点,生成的索引。
- 为每个立方体生成唯一的顶点列表,将它们与形成三角形的索引存储在VBO中。使用
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?