2011-10-19 10 views
6

Recentemente ho aperto un po 'di problemi con OpenGL e mi sono imbattuto nella divisione tra consentire a OpenGL di gestire le matrici di visualizzazione/modello/proiezione o gestirle da soli, con la propria implementazione di matrice o una libreria come GLM. Ho visto che molti progetti di grandi dimensioni hanno una propria gestione delle telecamere (ad esempio gestiscono le proprie traduzioni, rotazioni, ecc.). Capisco perché sarebbe utile per assicurarmi di avere il pieno controllo del sistema, ma a parte questo sembra un sacco di lavoro per un guadagno marginale.Perché è meglio gestire in modo esplicito le matrici in OpenGL?

Perché è meglio fare la propria gestione piuttosto che utilizzare le funzioni OpenGL integrate? Ovviamente questo è nel contesto di una pipeline di shader, non del default della funzione fissa.

(Ciò si applica a qualsiasi libreria 3D).

+5

Ho intenzione di astenermi dal downvoting, ma di solito non mi piacciono le domande sul modulo "Perché è meglio fare X che Y?" che presuppone che un modo sia migliore dell'altro. Se non conosci il * perché *, probabilmente non sei qualificato per sapere * quale * è migliore. Un fraseggio migliore sarebbe "Perché [alcune persone] sostengono l'uso di X invece di Y?" –

+0

La ragione per cui l'ho formulata in questo modo è perché tutto ciò che ho visto suggerisce che è meglio farlo esplicitamente, e non ci sono stati contrappunti: so che è una terribile argomentazione induttiva, ma ho pensato che avrebbe attirato più attenzione. concordo però con il tuo punto, +1 – jli

risposta

7

(Per inciso, OpenGL ES 2 non è trasformare la struttura di gestione, così in alcuni casi non hai altra scelta.)

più sul punto, ho trovato la gestione di matrici via di OpenGL integrato matrice di pile a essere un vero e proprio dolore, a volte, costringendomi a spingere e pop piuttosto abbondantemente nelle porzioni più intricati della mia codice di rendering, anche riordinando il rendering a volte solo per semplificare la gestione dello stack. Ho anche scritto una classe pop-poper C++ che usa RAII per gestire automaticamente tutto questo, ma richiede un'attenta analisi delle variabili locali.

Quando sono passato a ES 2, sono rimasto sbigottito nell'apprendere che tutta quella funzionalità era sparita. Tuttavia, ho trovato che il passaggio alle mie matrici in realtà semplificate mio codice, perché ho potuto lavorare con più trasformazioni utilizzando una combinazione di variabili locali e membri (con nomi significativi) senza perdersi nello spazio, e lo stack di trasformare è stato sostituito principalmente utilizzando la chiamata stack - cioè, la corrente trasformare è una variabile matrice solo locale che viene passato come genitore trasformare parametro alla funzione successiva giù - ma con la possibilità di farlo in modo diverso in altri momenti.

+0

+1, Aspetti positivi, aspetterò altre potenziali risposte prima di accettare – jli

1

Lo stack matrix gestito da GL è obsoleto negli ultimi rev. delle specifiche OpenGL. Quindi, gestirli da soli è l'opzione solo.

3

E 'meglio per una lunga lista di ragioni. recente presentazione di Apple sui miglioramenti OpenGL in OSX Lion dice meglio: le specifiche OpenGL più recenti (soprattutto 3.2 su un massimo) si concentrano meglio a rappresentare ciò che la GPU è in realtà facendo. In OpenGL 2.1, tutte le operazioni della matrice avvengono sulla CPU. Quindi, non solo non vi è alcun magico beneficio accelerato nell'uso delle matrici GL, siete bloccati in un modello completamente arbitrario di gestione delle matrici: solo le matrici della vista modello (per i vertici), i limiti delle dimensioni dello stack matriciale, un numero limitato di operazioni matriciali , ecc.

Quando inizi a gestire le tue matrici, inizi a capire perché è molto meglio. Man mano che le scene diventano più complesse, si inizia a vedere la necessità di più cache di matrici (oltre solo "proiezione" e "vista modello"). Scopri le opportunità per costruire funzioni di matrice più utili. Ad esempio, quale suono è più piacevole da usare? glRotatef(90.0f, 1.0f, 0.0f, 0.0f); o matrix.rotateX(90.0f);? Mi ha sempre infastidito il fatto che dovessi specificare l'asse di rotazione ogni volta!

Come si inizia a riconoscere la divisione tra le operazioni della CPU e le operazioni GPU, si apprezzerà la gestione delle proprie matrici.

+0

+1 Per aver menzionato che le vecchie operazioni della matrice GL non vengono eseguite magicamente sulla GPU. –

Problemi correlati