2013-03-27 7 views
14

Poiché ci sono due modi per utilizzare OpenGL con Qt 5 (QOpenGL/QtOpenGL wrapper e regolare API OpenGL), mi chiedo quali sono i limiti di ciascuno. Qualcuno potrebbe dire se ci sono limitazioni con il wrapper QOpenGL di cui dovrei essere a conoscenza?OpenGL vs QOpenGL/QtOpenGL in Qt 5: differenze e limitazioni?

Il motivo per cui lo sto chiedendo è perché non voglio iniziare a utilizzare il wrapper QOpenGL e scoprire che non posso utilizzare la piena funzionalità dell'API OpenGL. Qualcuno ha esperienza con entrambi e potrebbe fornire alcuni suggerimenti in termini di capacità, prestazioni e facilità d'uso?

+1

questa domanda è incredibilmente rilevante per chiunque tenti di utilizzare Qt e opengl. Quindi sì, è costruttivo. – UmNyobe

risposta

16

Non voglio iniziare a utilizzare QOpenGL involucro e scoprire che non posso utilizzare la piena capacità di API OpenGL

Beh, Qt 5.0 di OpenGL involucri sono costruiti in cima la specifica 2.0 OpenGL ES (Embedded Systems) che è essenzialmente una versione annacquata delle specifiche desktop OpenGL 3.0. Qt ha scelto questa specifica per facilitare la portabilità in quanto è ampiamente supportata dalle piattaforme mobili, oltre ad essere supportata su quasi tutti i PC moderni. Se si sceglie di utilizzare i wrapper Qt bisogna aggirare le carenze delle specifiche OpenGL ES 2.0, che, per la maggior parte, rientrano nelle seguenti categorie:

  1. Nessun capacità di pipeline a funzione fissa. (nessuna pila di trasformazione, glBegin, glEnd, glLightf, ecc.)
  2. Nessun supporto per le funzionalità avanzate di OpenGL 3+ o supporto solo nelle estensioni. (oggetti buffer di texture, shader di calcolo, oggetti di carico atomico, shader di tessellation, oggetti buffer uniformi ecc.)
  3. Mancanza di determinati formati di texture (trame intere, trame immagine, ecc.)
  4. Piccole differenze in GLSL sintassi & semantica. (mancanza di qualificatori di layout, requisiti di precisione dei dati tramite highp, lowp dichiarazioni, ecc.)
  5. Mancanza di alcuni metodi di convenienza. (glBlitFramebuffer, glMultiDrawArrays, glDrawRangeElements, ecc ..)

Per una descrizione completa delle specifiche OpenGL ES 2.0 aspetto here.

Tuttavia, questa mancanza di funzionalità non significa che i wrapper Qt non possono realizzare ciò che è necessario. Sebbene OpenGL ES 2.0 manchi di molte utili funzionalità, è comunque possibile ottenere il 99% di quanto permesso dalla specifica OpenGL desktop completa. Se si decide di utilizzare una specifica OpenGL desktop tramite wrapper personalizzati, Qt può comunque gestire la creazione della finestra & dei contesti OpenGL desktop mediante l'uso della classe QGLFormat.

Ricordare che se si decide di utilizzare wrapper OpenGL desktop e di utilizzarli in un'applicazione Qt, alcune classi fornite da Qt potrebbero interferire con il funzionamento dei wrapper personalizzati. Ad esempio, le operazioni di QPainter su QGLWidget possono utilizzare la funzionalità delle specifiche OpenGL ES e interferire con il funzionamento degli oggetti wrapper.

Personalmente, preferisco usare wrapper OpenGL personalizzati in quanto preferisco di gran lunga le specifiche OpenGL desktop in quanto i set di funzionalità sono meglio definiti e offrono più opzioni per affrontare un problema.D'altra parte, Qt 5 fornisce alcune architetture assolutamente fantastiche per realizzare interfacce utente dinamiche rapide e potenti usando OpenGL ES. (Tramite QtQuick 2 e QML)

Quale API si adatta meglio alle vostre esigenze dipende essenzialmente dal fatto che stiate bersagliando o meno le piattaforme incorporate o mobili (nel qual caso siete obbligati a utilizzare OpenGL ES) e se siete disposti a sacrificare ulteriore tempo di sviluppo per scrivere e mantenere i wrapper OpenGL 3+ personalizzati.

+0

La risposta è la stessa se userei OpenGL 4.1 in entrambi i modi? Credo che tu possa usare il wrapper QOpenGL con la funzionalità 4.1 impostando la versione del contesto (cioè QGLFormat :: setVersion (4,1)) e chiamando le classi di OpenGL 4.1. – Maiss

+1

È possibile creare un contesto OpenGL 4.1 con Qt, ma si scoprirà che alcuni dei wrapper Qt sono stati progettati per le specifiche OpenGL ES e non supportano determinate funzionalità. Ad esempio, la classe 'QOpenGLFramebufferObject' non supporta il rendering di più target. –

+0

C'è una differenza di velocità? Se usi l'opengl api, le funzioni saranno più veloci rispetto all'utilizzo di Qopengl, o è lo stesso? – user1938107