2015-07-05 9 views
5

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.

  1. 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.

  1. Prendere la maglia dal passo 1, utilizzare thrust::sort() e thrust::unique() per rimuovere i vertici ridondanti, indici di calcolo utilizzando thrust::lower_bound(). salva i risultati in un VBO/IBO OpenGL mappato a CUDA. disegnare il modello usando glDrawElements().

Non ci sono ridondanti vertici VBO, generata indici.

  1. generare una lista unica di vertici per cubo, memorizzarli in VBO insieme ai loro indici formando triangoli nel IBO. Rendering utilizzando glDrawElements().
  2. 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?

+1

il metodo di misurazione FPS tiene conto del tempo necessario per rimuovere i vertici ridondanti utilizzando la spinta? –

+0

@ 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

risposta

1

Due cose possono aiutare:

  • cercando di ottimizzare l'utilizzo della cache di dati mettendo i vertici più o meno nell'ordine si disegnarli
  • cercando di ottimizzare post transform cache utilizzo (esiste un algoritmo per farlo here e le implementazioni possono probabilmente essere trovate in rete)
+0

Grazie a @Jerem, proverò questo algoritmo [Fast Vertex Cache Opt] (https://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html). Aggiornerà su come va. Mi piacerebbe trovare un algoritmo che usi meno memoria possibile, dato che le dimensioni delle maglie tendono a diventare molto grandi. – Harish

+0

Provato un'implementazione della CPU dell'algoritmo di cui sopra, funziona ma è troppo lento. ci sono voluti più di 12 secondi per la maglia da 60K, le mie mesh sono più alte di 20 me non è fattibile per una maglia di quelle dimensioni. Alla ricerca di una soluzione in grado di scalare la GPU. – Harish

+0

Hai provato a ordinare i vertici nell'ordine in cui li hai disegnati? – Jerem