OpenGL: modo efficiente per eseguire il rendering di un batch di geometria?

StackOverflow https://stackoverflow.com/questions/487244

  •  20-08-2019
  •  | 
  •  

Domanda

Questo è qualcosa che ho cercato per un po ', ma devo ancora trovare informazioni concrete o buoni esempi. Ho, diciamo, un mucchio di oggetti non collegati (strisce triangolari per esempio). Qual è il modo efficiente per renderli?

Ho sentito parlare di mettere diversi oggetti in un VBO per ridurre le chiamate openGL, ma non ho visto un esempio corretto di come farlo. Ho anche visto post che contraddicono questa idea. Quindi in questo momento, sono per lo più solo confuso.

È stato utile?

Soluzione

Prima di tutto, dovresti probabilmente usare VBO sempre. Per oggetti piccoli e grandi.

Quindi, il secondo problema è " come combinare più oggetti separati in un unico oggetto di grandi dimensioni? " - così per ridurre il numero di chiamate OpenGL che devono essere fatte. In genere, è possibile combinare oggetti che utilizzano le stesse trame, impostazioni di materiale e shader. Per esempio. se ci sono tonnellate di casse identiche in giro, potrebbe avere senso combinarle in più " pile di casse " ;.

Se un oggetto è un elenco di triangoli, la combinazione è semplice: basta creare un grande elenco di triangoli dagli elenchi di origine. Se un oggetto è una striscia triangolare, allora devi usare & Quot; triangoli degenerati & Quot; per unire le strisce (questa è un'ottimizzazione molto utile anche per un singolo oggetto, se non può essere rappresentato come una singola striscia).

A " triangolo degenerato " è un triangolo che ha due o tre indici di vertici identici. L'hardware grafico può riconoscerli e saltarli molto velocemente.

Quindi, se hai, ad es. due strisce con un triangolo ciascuna, per un totale di sei vertici.

Gli indici triangolari originali delle strisce sarebbero:

1) 0, 1, 2
2) 0, 1, 2

Ora unisci tutti i vertici insieme, quindi finisci con 6 vertici.

1) 0, 1, 2 (unchanged)
2) 3, 4, 5

Ormai hai un array di vertici, ma ancora due strisce separate. Devi unirti a loro inserendo triangoli degeneri:

1) 0, 1, 2, 2, 2, 3, 4, 5

(Penso che quanto sopra sia corretto, ma in realtà non è stato verificato)

L'idea è questa: con la striscia sopra, la scheda grafica trarrebbe triangoli da questi vertici:

0, 1, 2
1, 2, 2 <- degenerate! won't be drawn
2, 2, 2 <- degenerate! won't be drawn
2, 2, 3 <- degenerate! won't be drawn
3, 4, 5

In generale, è necessario inserire due o tre triangoli degeneri in base alla lunghezza della striscia originale, in modo che l'avvolgimento del triangolo rimanga corretto.

Altri suggerimenti

Guarda glDrawElements () , è un buon modo per ottenere ciò che vuoi. Si noti che le prestazioni potrebbero diminuire se i dati cambiano ogni frame, poiché è quindi necessario aggiornare le parti pertinenti dei dati, il che significa che copiarli nella memoria della scheda grafica. Per i dati statici, questo è molto veloce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top