Geometria istanziata in OpenGL ES 2.0


12

Sto progettando di eseguire istanze di geometria in OpenGL ES 2.0 Fondamentalmente ho intenzione di rendere la stessa geometria (una sedia) forse 1000 volte nella mia scena.

Qual è il modo migliore per farlo in OpenGL ES 2.0?

Sto prendendo in considerazione il passaggio della vista del modello mat4 come attributo. Poiché gli attributi sono dati per vertice, devo passare lo stesso mat4, tre volte per ciascun vertice dello stesso triangolo (poiché la vista modello rimane costante attraverso i vertici del triangolo).

Ciò equivarrebbe a molti dati extra inviati alla GPU (2 vertici extra * 16 float * (numero di triangoli) quantità di dati extra).

O dovrei inviare mat4 solo una volta per triangolo? Ma come è possibile utilizzare gli attributi poiché gli attributi sono definiti come dati "per vertice"?

Qual è il modo migliore ed efficiente per eseguire instanziamenti in OpenGL ES 2.0?


3
Mi manca davvero glVertexAttribDivisor:(
Will

Risposte:


9

ES2 non ha né glVertexAttribDivisor né texture in virgola mobile, quindi le opzioni sono piuttosto limitate.

Metti sicuramente il tuo modello di sedia in un VBO se non lo fai già. Da lì sei più o meno limitato alle singole chiamate di estrazione - una per sedia - quindi si tratta di ottenere la matrice di trasformazione per ogni sedia nella GPU nel modo più efficiente possibile.

Potresti farlo con le normali chiamate glUniform, oppure potresti abusare di alcuni slot attributo vertice extra ed effettuare alcune chiamate glVertexAttrib (nota: non glVertexAttribPointer) prima di disegnare ogni sedia, specificando la matrice usando 4 di questi slot, e questi valori "si attaccheranno" per ogni successivo vertice sulla sedia. Questo può essere un percorso abbastanza veloce su alcuni hardware ma più lento su altri, quindi dovrai sperimentare.

Se le tue sedie non ruotano un'altra cosa che puoi fare è semplicemente inviare la posizione al tuo shader e costruire al volo una nuova matrice di trasformazione. Sembra orribile ma in realtà è incredibilmente veloce (sta solo impostando 3 float) e potrebbe fare il lavoro.

Nel complesso, però, e supponendo che tu stia mirando a una tipica piattaforma mobile, sto pensando che qualunque cosa tu faccia, disegnare le chiamate ti ucciderà.


6

La tua scommessa migliore è quella di utilizzare un approccio basato sull'istanza piuttosto simile ai modelli skin. Crea un VBO che conterrà molte copie della tua sedia, tutte identiche. Ora, ogni vertice deve avere un attributo byte che conterrà l'indice alla matrice di trasformazione che verrà applicata ad esso. Invia una serie di matrici al tuo shader e usale come trasformazione del mondo di ciascuna delle tue sedie. In questo modo, è possibile disegnare in ogni chiamata tutte le sedie della dimensione massima del parametro array, senza dover riscrivere alcun dato nel VBO.


3

Wolfire Games ha un eccellente post sul blog sull'istanziamento rapido di oggetti . Ciò che fanno è rendere il modello un sacco di volte, ma inviare una matrice diversa per ogni oggetto a uno slot uniforme.

Questo è un modo abbastanza efficiente per istanziare un intero gruppo di oggetti, perché devi solo inviare i dati una volta (il più grande collo di bottiglia durante il rendering di un batch di oggetti sarà sempre la larghezza di banda) e quindi trasformare il modello in uno shader.


+1 Comunque, non sono ancora sicuro che fare riferimento al testo Nvidia sia applicabile anche ai chip PVR mobili. Soprattutto riguardo alla loro menzione sulla parte del conducente . http.download.nvidia.com/developer/SDK/Individual_Samples/DEMOS/…
Eonil

1

http://www.youtube.com/watch?v=rfQ8rKGTVlg

Questo è un Google Talk su WebGL, che è OpenGL ES per JavaScript, il che significa che non esiste neanche una geometria. Potrebbe darti un'idea, anche se è difficile da dire perché non so se il tuo collo di bottiglia è sulla GPU o sulla CPU.

Tuttavia, dovresti conoscere variabili uniformi, non è assolutamente necessario inviare un mat4 in un attributo, tutti i vertici della tua sedia saranno trasformati dalla stessa matrice, devi inviarlo solo una volta per modello, non per triangolo. Le variabili uniformi ti consentono di farlo, sono un tipo speciale di variabili che puoi impostare nel programma shader stesso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.