我正在使用CUDA上運行的Marching Cubes算法從體積數據生成網格。如何優化VBO/IBO以最大化GPU緩存使用率
我試過保存網格並以3種方式渲染它。
- 保存一組粗糙的三角形作爲頂點數據的連續數組。 我估計大小,如果第一遍中,創建一個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存儲與它們的索引在所述三角形IBO沿。使用
glDrawElements()
呈現。 在VBO
在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?
沒有你的FPS測量方法考慮到它需要刪除使用推力冗餘頂點的時間? –
@ m.s。刪除只能進行一次。我不是在尋找實時清除方法。當等值被更改時,我只是在方法1中渲染原始網格。一旦變化不變,我就會處理大約4秒的去除。之後,我只使用VBO/IBO渲染網格。我想爲這個網格提供更高的FPS,而只是渲染,當我測量FPS時不會進行提取或壓縮。 – Harish