我使用在CUDA上运行的Marching Cubes算法从体积数据生成网格。
我尝试过保存网格并以3种方式渲染它。
V0x, V0y, V0z, N0x, N0y, N0z, V1x, V1y, V1z, N1x, N1y, N1z, ...
并使用glDrawArrays()
绘制它。
VBO中的冗余顶点,每个多维数据集的冗余顶点,无指数。
thrust::sort()
和thrust::unique()
删除冗余顶点,使用thrust::lower_bound()
计算索引。将结果保存到映射到CUDA的OpenGL VBO / IBO。
使用glDrawElements()
绘制模型。VBO中没有冗余顶点,生成索引。
glDrawElements()
渲染。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?
答案 0 :(得分:1)
有两件事可以提供帮助: