2012-11-22 19 views
6

Ho difficoltà a comprendere come gestire/eseguire il rendering di oggetti multipli con OpenGL. Mi sono guardato intorno e ho trovato risposte in google e nel libro rosso OpenGL che ballano intorno a ciò che sto cercando di capire, ma ho bisogno di vedere se ho un'idea giusta.OpenGL gestione di più oggetti

Il mio primo pensiero è stato che dovevo gestire i dati di localizzazione con le variabili di traslazione e rotazione rispettivamente per X, Y e Z. Conservare una sola maglia, VBO statico per quella classe, quindi per ogni istanza voglio rendere fare un ciclo For-Next per

  • carico identità
  • trasformare l'dell'oggetto specifica posizione/rotazione
  • uso drawarrays per rendere la rete in quella posizione
  • ciclo per l'oggetto successivo e ripetere quanto sopra per ogni oggetto

Fa gestire le trasformazioni di questo tipo per ogni aggiornamento battente di performance s ignificantly?

un altro metodo di cui qualcuno stava menzionando stava incollando tutti i dati di localizzazione per ogni vertice in un singolo VBO, quindi il rendering con una singola chiamata. In questo metodo, sto assumendo di 'creare' un oggetto che avrei bisogno di elaborare i dati di localizzazione di ogni vertice attraverso una funzione che avrebbe preso le sue coordinate locali (attraverso l'array statico) e aggiungere i dati di localizzazione dell'oggetto specifico al vertice, quindi memorizzarlo nel VBO? Se è così, come gestirò anche la rotazione?

Il terzo pensiero che avevo era di memorizzare una matrice 4x4 in ogni istanza dell'oggetto che avrebbe tenuto le informazioni di traduzione/rotazione, quindi quando andavo a render, avrei appena caricato la matrice di quell'oggetto, disegnato la mesh dal singolo VBO, quindi caricare la matrice dell'oggetto successivo, disegnare dallo stesso VBO, ecc ....

Infine, ho visto alcune persone suggerire di avere un VBO per ogni singolo oggetto e chiamare drawarray per ogni singola istanza. In questo modo mi sembra molto inefficiente e mi chiedo quale sia il punto di avere i VBO se lo chiami per ogni mesh. Sembra che la modalità immediata (ho capito che è ammortizzata) sarebbe più veloce solo perché non hai il sovraccarico di creare e legare il VBO per ogni singolo oggetto.

Sono validi tutti/tutti questi metodi di gestione/rendering di più oggetti? In tal caso, quali sono i vantaggi e gli svantaggi di ciascun metodo?

I metodi che hanno più senso sono quelli che hanno un singolo VBO per mesh, quindi li trasformano per aggiornamento o caricano la matrice di ciascun oggetto per aggiornamento e il rendering in questo modo. Sono abbastanza nuovo per OpenGL e rendering grafico, quindi sto cercando di comprendere appieno i modi ottimali per gestire le informazioni richieste per il rendering di più oggetti.

risposta

3
  • trasformazione al dell'oggetto specifica posizione/rotazione

Ciò significa semplicemente si carica una matrice 4x4 di una variabile uniforme.

La gestione delle trasformazioni come questa per ogni aggiornamento di fotogramma influisce in modo significativo sulle prestazioni?

La trasformazione verrà eseguita nel vertex shader, moltiplicando la suddetta matrice e le coordinate del vertice, in parallelo per molti vertici.

un altro metodo che qualcuno menzionare sporgeva tutti i dati di localizzazione per ogni vertice in una singola VBO poi rendendolo con una singola chiamata. In questo metodo, sono supponendo di 'creare' un oggetto avrei bisogno di elaborare i dati di localizzazione di ogni vertice attraverso una funzione che prenderebbe le sue coordinate locali (attraverso l'array statico) e aggiungere i dati di localizzazione dell'oggetto specifico al vertice, quindi memorizzarlo nel VBO? Se è lo , come gestirò anche la rotazione?

Questa non sembra essere una buona idea, perché dovrai caricare i dati su ogni frame (o almeno quando si posiziona l'oggetto/orientamento chages).

Il terzo metodo sembra lo stesso del primo, solo in OGL3 + termini, wheras il primo sembra in OGL termini 2.x :)

Infine, ho visto alcune persone suggeriamo di avere una VBO per ogni singolo oggetto e chiamando il drawarray per ogni singola istanza.

Forse hai frainteso e volevano dire VAO, non VBO? Con un VAO, si caricano gli attributi dei vertici (in VBO), si associa il VAO, si lega ciascun VBO alla posizione dell'attributo appropriata e lo si fa una sola volta all'inizio. Su ogni fotogramma semplicemente fare:

// Bind the VAO 
glBindVertexArray(vao) 

// Draw the object 
glDrawArrays/glDrawArraysInstanced/etc. 

// CLear VAO binding 
glBindVertexArray(0) 

noti che si può ancora avere vertice attributi per molti oggetto distinto nello stesso VBO, ricordare glDrawArrays e altri hanno un parametro, che ha determinato da dove nella matrice per iniziare a disegnare.

+1

Se una serie di posizioni di oggetti sono statiche, ovvero non cambiano in modo dinamico, inserirle tutte in un singolo VBO, con una trasformazione comune e disegnarle tutte con una singola chiamata glDrawElements * è * più performante rispetto all'iterazione sugli oggetti, disegnando ogni oggetto per oggetto. Ma solo per geometria statica e posizioni. – datenwolf

+1

era decisamente VBO e non VAO. Quindi la mia domanda è questa: potrei in qualche modo memorizzare le matrici di ogni oggetto in un VBO e poi passarlo allo shader tramite un VAO rilegato? –

+1

Se stai facendo disegni istanziati - sì. Ad esempio, puoi rendere la matrice della vista modello come un attributo istanziato (con 'glVertexAttribDivisor'). Oppure puoi impostare le matrici come array uniforme e indicizzare questo array usando 'gl_InstanceID'. Per quanto riguarda il disegno non istanziato, non conosco un modo sensato per sapere nello shader quale matrice usare. – chill

Problemi correlati