Sto generando una mesh da dati volumetrici utilizzando l'algoritmo Marching Cubes in esecuzione su CUDA.Come ottimizzare un VBO/IBO per massimizzare l'utilizzo della cache GPU
Ho provato a salvare la mesh e renderla in 3 modi.
- salvare un insieme grezzo di triangoli come un array continuo di dati di vertice. I stimare la dimensione se il primo passaggio, crea un OpenGL VBO, mappa a CUDA e scrivere i dati di vertice ad esso nel seguente formato
V0x, V0y, V0z, N0x, N0y, N0z, V1x, V1y, V1z, N1x, N1y, N1z, ...
e disegnare utilizzando glDrawArrays()
.
Vertici ridondanti in VBO, vertici ridondanti per cubo, nessun indice.
- Prendere la maglia dal passo 1, utilizzare
thrust::sort()
ethrust::unique()
per rimuovere i vertici ridondanti, indici di calcolo utilizzandothrust::lower_bound()
. salva i risultati in un VBO/IBO OpenGL mappato a CUDA. disegnare il modello usandoglDrawElements()
.
Non ci sono ridondanti vertici VBO, generata indici.
- generare una lista unica di vertici per cubo, memorizzarli in VBO insieme ai loro indici formando triangoli nel IBO. Rendering utilizzando
glDrawElements()
. vertici
ridondanti in VBO, unici vertici per Cube, indici generati per Cube
ora Il FPS ottengo per lo stesso insieme di dati allo stesso ISO-Valore `è
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
Anche se il Metodo 2 produce il minor numero di vertici, il FPS è basso. Credo che questo sia dovuto al fatto che gli indici sono in un ordine che riduce al minimo l'utilizzo della cache GPU. L'ordine degli indici per il metodo 3 ottiene un utilizzo più elevato della cache della GPU, quindi l'FPS più alto.
Come modificare/modificare il metodo 2 per ottenere un FPS superiore?
il metodo di misurazione FPS tiene conto del tempo necessario per rimuovere i vertici ridondanti utilizzando la spinta? –
@ m.s. La rimozione viene eseguita una sola volta. Non sto cercando un metodo di rimozione in tempo reale.Quando il valore iso viene modificato, eseguo semplicemente il rendering della mesh grezza nel Metodo 1. Una volta che la modifica è costante, procedo quindi alla rimozione che richiede circa 4 secondi. Dopo di ciò, io uso solo VBO/IBO per rendere la mesh. Voglio FPS più alti per questa mesh, mentre solo il rendering, nessuna estrazione o compattazione è fatta quando misuro FPS. – Harish