Stack di matrice OpenGL vs Moltiplicazione della mano


8

Che è più efficiente usando lo stack di trasformazione di OpenGL o applicando le trasformazioni a mano.

Ho sentito spesso che dovresti ridurre al minimo il numero di transizioni di stato nella tua pipeline grafica. Spingere e far scoppiare le matrici di traduzione sembra un grande cambiamento. Tuttavia, mi chiedo se la scheda grafica potrebbe essere in grado di compensare il singhiozzo della pipeline utilizzando il suo hardware di esecuzione parallela per moltiplicare in blocco i vertici.

Il mio caso specifico. Ho reso il carattere su un foglio sprite. Le coordinate di ciascun carattere o stringa vengono calcolate e aggiunte a un buffer di vertici. Ora devo spostare quella stringa. Sarebbe meglio scorrere il buffer dei vertici e regolare manualmente ciascuno dei vertici o spingere temporaneamente una nuova matrice di traduzione?


Dipende da quale versione GL stai prendendo di mira. Sono deprecati in 3.xe versioni successive.
Il comunista Duck il

Risposte:


7

Comprendo che nelle versioni più recenti delle specifiche (3.3 e 4.x) le pile di matrici sono sparite e devi tenere traccia delle matrici di trasformazione a mano. Credo che questo potrebbe essere vero anche per le specifiche mobili (ES).

Se stai cercando un modo coerente per gestire manualmente le tue matrici, potresti essere interessato a GLM . È una libreria matematica piuttosto ordinata (che include trasformazioni di matrici) modellata secondo le specifiche GLSL, quindi devi solo tenere un insieme di routine matematiche nella tua testa quando hai a che fare con il codice OpenGL.


Qualcuno può confermare questo? Ho imparato la programmazione grafica con OpenGL 1.5 e ho pensato di essere avanzato perché stavo sperimentando alcune delle funzionalità 2.0. Potresti dire che sono un po 'fuori dal giro. Eliminare il supporto per le matrici di traduzione sembra essere un enorme svantaggio.
deft_code

1
Doppio controllo. Sì, le pile di matrici sono deprecate in 3.0 - 3.2 e rimosse in 3.3 e 4.x. L'idea è che da quando l'intera pipeline è diventata programmabile, passerai la tua matrice finale al tuo shader e proseguirai da lì. Tuttavia, non c'è nulla che ti impedisca di rimanere con OpenGL 2.0. Tutte le funzionalità di stack di matrici a cui sei abituato saranno ancora lì.
Bob Somers,

Si noti che ciò non significa che il "supporto per le matrici di traduzione" è stato eliminato, @deft_code. Una matrice di traduzione è solo un insieme particolare di valori in virgola mobile, dopotutto, puoi costruirne banalmente tu stesso. È più nell'area di "algebra lineare" che l'accesso alla pipeline grafica, in realtà - notate che D3D non ha nemmeno funzioni analoghe (sono in una libreria di utilità separata, D3DX).

1
Leggera aggiunta: GLES 1.x è l'analogo a funzionalità fissa di OpenGL 1.5 (ish) e include le pile di texture, vista modello e proiezione. GLES 2.x è OpenGL incorporato completamente programmabile e non include affatto le operazioni con matrici o il resto della pipeline con funzionalità fissa. Quindi in GLSL non c'è nemmeno gl_Vertex / Normal / Color / etc. Come passare le informazioni in un programma shader dipende interamente da te.
Tommy,

3

Lo stack è l'opzione meno ottimale qui - non perché spingerlo e saltarlo era costoso, poiché non dovrebbe mai indurre un cambiamento di stato a livello di driver complesso (la matrice non dovrebbe essere inviata alla scheda fino a quando non viene emesso un comando di rendering , quindi è tutta manipolazione lato CPU nell'API, di solito).

Il problema con lo stack è che ha un limite a quanto puoi spingerlo - è uno dei parametri che potresti ottenere tramite glGet * Penso. Non c'è grande vantaggio nell'usare la pila a meno che tu non abbia o non sia incapace / non desideri scrivere matematica a matrice. Consiglierei di farlo da soli.

Non so quale sia lo stato delle funzioni dello stack nella moderna GL. Credo che siano stati deprecati / rimossi, ma non ho avuto la necessità di utilizzare GL da un po 'di tempo, quindi non mi sono tenuto aggiornato.


3

Come altri hanno notato, la pila di matrici sta per uscire, il che è un buon motivo per studiare le alternative.

In uno dei miei progetti, ho usato le operazioni di matrice di OpenGL per calcolare le mie matrici, ma alla fine ho dovuto usare le funzioni glGet per recuperare la matrice in modo da poter fare alcune operazioni sulla matrice che le funzioni di OpenGL non supportavano. La performance è stata terrificante e ho rintracciato la perdita nella singola funzione glGet. È possibile che le operazioni a matrice vengano effettivamente eseguite sulla GPU in qualche modo e l'uso di glGet ha causato lo svuotamento della pipeline o qualcosa del genere.

Qualunque sia il motivo, ho sostituito le operazioni di matrice con CML , la libreria matematica configurabile e le prestazioni sono migliorate notevolmente. Non solo non ero più legato alle metriche delle prestazioni delle operazioni della matrice OpenGL, CML includeva anche tonnellate di operazioni che OpenGL non supporta.

E implementare una pila di matrici è abbastanza semplice usando il vettore STL o alcuni di questi.


2

Non sono sicuro del tuo livello di esperienza, ma consiglierei di farlo a mano. Potrebbe essere necessario uno sforzo maggiore per imparare come farlo, ma è immensamente utile sapere cosa stanno facendo le tue matrici e riuscire a manipolarle da soli. Ti renderà inoltre più consapevole dei problemi che possono sorgere quando si applicano matrici in diversi ordini (ad es. Ridimensionamento e rotazione). So di aver passato molte ore a cercare di scoprire strani "bug" prima di decidere che il mio tempo sarebbe stato speso meglio studiando a fondo cosa stava facendo ogni operazione. Vale la pena l'investimento.

Affrontare il problema specifico, applicare una trasformazione ai vertici sembra il modo più semplice, basta essere consapevoli dell'ordine delle operazioni delle matrici.


1

Il problema principale che vedo è che è necessario accedere ai risultati per altre attività di gioco e ottenere tali risultati può essere complicato e lento.

Ecco perché preferisco fare quelle operazioni con le matrici da solo.

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.