Outils d'utilisateurs

Outils du Site


opengl_dans_qt5

Différences

Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue

opengl_dans_qt5 [2015/01/22 18:37]
gbdivers
opengl_dans_qt5 [2016/03/27 20:20] (Version actuelle)
winjerome
Ligne 13: Ligne 13:
  
 Le support d’OpenGL dans Qt 5 a été modifié pour mieux l’intégrer avec les nouveaux modules de Qt : QtQuick2 et Qt3D. Cet article présente les modifications apportées dans Qt 5. Le support d’OpenGL dans Qt 5 a été modifié pour mieux l’intégrer avec les nouveaux modules de Qt : QtQuick2 et Qt3D. Cet article présente les modifications apportées dans Qt 5.
 +
 +<note>**Note sur les versions d'OpenGL**
 +
 +OpenGL fonctionne via un système de versions et d'extensions. Quand on veut utiliser une fonction GL, il faut regarder dans quelles versions d'OpenGL elle est disponible. Ou l'inverse : quand on utilise une version d'OpenGL, il faut vérifier les fonctions disponibles.
 +
 +Les extensions sont un complément aux versions. Elles permettent d'appeler des fonctions non disponibles dans une version donnée (par exemple, appeler une fonction de GL 4 dans GL 3).
 +
 +Et bien sûr, tout cela va dépendre du matériel et des capacités de la carte graphique. (Ce qui signifie qu'avant d'utiliser une fonction, il faut vérifier que le matériel la supporte).
 +
 +Bref, pas simple.
 +
 +Qt propose plusieurs outils pour gérer cela. 
 +
 +QOpenGLFunctions fournit les fonctions de base que tout système DOIT supporter pour pouvoir faire tourner une application Qt 5. C'est donc la base minimale que l'on peut utiliser en ayant la garantie que cela fonctionne partout. (C'est en gros basé sur un sous ensemble d'OpenGL ES 2.)
 +les classes QOpenGLFunctions_x_y, qui permettent d'utiliser une version spécifique de GL (par exemple http://doc.qt.io/qt-5/qopenglfunctions-2-0.html ou http://doc.qt.io/qt-5/qopenglfunctions-4-5-core.html). Mais il faut vérifier que le matériel supporte cela avant d'utiliser une version particulière de GL
 +QOpenGLContext::hasExtension et QOpenGLContext::getProcAddress permettent de gérer manuellement les extensions. Idem, il faut tester le matériel.
 +Toutes les fonctions plus haut niveau QOpenGLXxx (par exemple QOpenGLTexture, QOpenGLShaderProgram, QOpenGLFramebufferObject) permettent d'utiliser des fonctionnalités de GL sans se préoccuper des versions de GL. Ces classes vérifient en interne les fonctions GL utilisables, pour optimiser au mieux les tâches.
 +Bref, pas simple tout cela.
 +
 +Je vous conseille de prendre un cours/tutos/livre sur une version d'OpenGL pas trop ancienne, de créer un contexte Qt avec une version de GL correspondante et de bosser avec cela.
 +
 +Dans un programme pro, on ne pourra bien sûr pas faire comme cela. Il faudra faire un code minimal qui fonctionne sur un maximum de matériel, puis écrire du code spécifique pour chaque fonctionnalité/matériel qui permettent d'optimiser le rendu. C'est beaucoup de boulot.
 +</note>
 +
  
 ===== Activer OpenGL dans Qt 4 ===== ===== Activer OpenGL dans Qt 4 =====
Ligne 68: Ligne 92:
  
   * QOpenGLContextGroup (Qt 5.0) : Possibilité de partager des ressources entre plusieurs contextes (par exemple, si une texture est utilisée dans 2 contextes, on évite de la charger 2 fois, on la partage). Plus de 2 contextes ?   * QOpenGLContextGroup (Qt 5.0) : Possibilité de partager des ressources entre plusieurs contextes (par exemple, si une texture est utilisée dans 2 contextes, on évite de la charger 2 fois, on la partage). Plus de 2 contextes ?
-  * QOpenGLVersionProfile (Qt 5.1) : permet de creer un contexte avec une version spécifique de GL avec versionFunctions. Préférer la version avec template.+  * QOpenGLVersionProfile (Qt 5.1) : permet de créer un contexte avec une version spécifique de GL avec versionFunctions. Préférer la version avec template.
  
 ==== Debug et profiling ==== ==== Debug et profiling ====
Ligne 120: Ligne 144:
   * QOpenGLTimerQuery (Qt 5.1)   * QOpenGLTimerQuery (Qt 5.1)
  
-En fonction des extensions ARB_timer_query et EXT_timer_query extensions.+En fonction des extensions ARB_timer_query et EXT_timer_query extensions. Voir [[deboguer_avec_opengl_4|]] pour les détails. 
 + 
 +<code cpp> 
 +// init 
 +QOpenGLTimeMonitor::setSampleCount(n); 
 +QOpenGLTimeMonitor::create(); 
 + 
 +// définir des points de mesure 
 +QOpenGLTimeMonitor::recordSample(); 
 + 
 +// lire les résultats 
 +QOpenGLTimeMonitor::isResultAvailable(); 
 +QOpenGLTimeMonitor::waitForIntervals();  // intervals 
 +QOpenGLTimeMonitor::waitForSamples();    // raw timestamp 
 + 
 +// reset 
 +QOpenGLTimeMonitor::reset(); 
 +</code> 
 + 
 +* OpenGL >=3.3 offers full support for all timer query functionality. 
 +* OpenGL 3.2 with the ARB_timer_query extension offers full support for all timer query functionality. 
 +* OpenGL <=3.2 with the EXT_timer_query extension offers limited support in that the timestamp of the GPU cannot be queried. Places where this impacts functions provided by Qt classes will be highlighted in the function documentation. 
 +* OpenGL ES 2 (and OpenGL ES 3) do not provide any support for OpenGL timer queries. 
 + 
 +Granularité de 1 nanosecondes. 
 + 
 +<code cpp> 
 +// simple 
 +QOpenGLTimerQuery::begin(); 
 +QOpenGLTimerQuery::end(); 
 + 
 +QOpenGLTimerQuery::isResultAvailable(); 
 +QOpenGLTimerQuery::waitForResult(); 
 +</code>
  
 ==== Extensions et fonctions ==== ==== Extensions et fonctions ====
  
   * QOpenGLFunctions (Qt 5.0) : support des fonctions OpenGL. Pour utiliser une fonction d'une lib en général, besoin du prototype (nom, paramètres, etc) et l'adresse dans la lib. Fait automatiquement par le link lors de la compilation.   * QOpenGLFunctions (Qt 5.0) : support des fonctions OpenGL. Pour utiliser une fonction d'une lib en général, besoin du prototype (nom, paramètres, etc) et l'adresse dans la lib. Fait automatiquement par le link lors de la compilation.
-  * QAbstractOpenGLFunctions et QOpenGLFunctions_X_x (Qt 5.1) : chargement des fonctions specifiques d'une version de GL.+  * QAbstractOpenGLFunctions et QOpenGLFunctions_X_x (Qt 5.1) : chargement des fonctions spécifiques d'une version de GL.
  
  
Ligne 136: Ligne 193:
 Remarque : a partir de GL 3.2, suppression des anciennes fonctions dans Core, conservée dans Compatibility . Remarque : a partir de GL 3.2, suppression des anciennes fonctions dans Core, conservée dans Compatibility .
  
-Qt permet de gérer tout cela (création d'un contexte avec une version spécifique, chargement d'une extension). Par défaut, OpenGL ES 2 (supporter partout, même sur mobile).+Qt permet de gérer tout cela (création d'un contexte avec une version spécifique, chargement d'une extension). Par défaut, OpenGL ES 2 (supporté partout, même sur mobile).
  
 <code cpp> <code cpp>
opengl_dans_qt5.1421948220.txt.gz · Dernière modification: 2015/01/22 18:37 par gbdivers