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/15 03:05]
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 47: Ligne 71:
 Un contexte est une "zone" de travail d'OpenGL, contient les informations permettant à OpenGL de fonctionner. Peut correspondre à une fenêtre visible à l'écran, et dans ce cas, tous les rendus réalisés avec ce contexte seront visible dans cette fenêtre, ou hors écran. Un contexte est une "zone" de travail d'OpenGL, contient les informations permettant à OpenGL de fonctionner. Peut correspondre à une fenêtre visible à l'écran, et dans ce cas, tous les rendus réalisés avec ce contexte seront visible dans cette fenêtre, ou hors écran.
  
-  * QOpenGLContext : information a propos du contexte OpenGL, par exemple version d'OpenGL prise en charge, gestion des extensions OpenGL, la surface correspondante à ce contexte.+  * QOpenGLContext (Qt 5.0) : information a propos du contexte OpenGL, par exemple version d'OpenGL prise en charge, gestion des extensions OpenGL, la surface correspondante à ce contexte.
  
   * QSurface : classe abstraite, qui représente n'importe quelle surface. Peut être une surface visible (QWindow) ou une surface non visible à l'écran (QOffscreenSurface).   * QSurface : classe abstraite, qui représente n'importe quelle surface. Peut être une surface visible (QWindow) ou une surface non visible à l'écran (QOffscreenSurface).
Ligne 56: Ligne 80:
   * QWindow : surface visible à l'écran. Nombreuses informations non spécifiques à OpenGL (titre de la fenêtre,  gestion des events, etc.). Sera généralement utilisé via QWidget ou QQuickView, sauf si on travaille directement avec OpenGL.   * QWindow : surface visible à l'écran. Nombreuses informations non spécifiques à OpenGL (titre de la fenêtre,  gestion des events, etc.). Sera généralement utilisé via QWidget ou QQuickView, sauf si on travaille directement avec OpenGL.
   * QOffscreenSurface : surface non visible. Partager des ressources avec d'autres contexte OpenGL pour charger des textures ou dessiner dans un FBO de façon asynchrone. Remarque : à créer dans le thread principal.   * QOffscreenSurface : surface non visible. Partager des ressources avec d'autres contexte OpenGL pour charger des textures ou dessiner dans un FBO de façon asynchrone. Remarque : à créer dans le thread principal.
-  * QOpenGLWindow+  * QOpenGLWindow et QOpenGLWidget (Qt 5.4) : hérite de QWindow et QWidget, en creant un contexte OpenGL en interne et proposent les fonctions ''initializeGL'', ''paintGL'' et ''resizeGL''.
  
 <code cpp> <code cpp>
Ligne 67: Ligne 91:
 </code> </code>
  
-  * QOpenGLContextGroup : 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+  * 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 ====
  
   * Debug contexte. Permet d'avoir des messages de debug générés par le driver ou le GPU. Cf [[deboguer_avec_opengl_4|]]   * Debug contexte. Permet d'avoir des messages de debug générés par le driver ou le GPU. Cf [[deboguer_avec_opengl_4|]]
 +  * QOpenGLDebugLogger (Qt 5.1)
 +  * QOpenGLDebugMessage (Qt 5.1)
  
 <code cpp> <code cpp>
Ligne 115: Ligne 141:
 </code> </code>
  
-  * QOpenGLTimeMonitor +  * QOpenGLTimeMonitor (Qt 5.1) 
-  * QOpenGLTimerQuery+  * QOpenGLTimerQuery (Qt 5.1) 
 + 
 +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 : 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 spécifiques d'une version de GL. 
  
 OpenGL cas particulier, puisque les fonctions et fonctions dispo dépend du GPU sur lequel s'exécute le programme, peut changer pour chaque utilisateur. Besoin de gestion plus dynamique. OpenGL cas particulier, puisque les fonctions et fonctions dispo dépend du GPU sur lequel s'exécute le programme, peut changer pour chaque utilisateur. Besoin de gestion plus dynamique.
Ligne 130: 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>
Ligne 149: Ligne 212:
 ==== Shaders ==== ==== Shaders ====
  
-  * QOpenGLShader +  * QOpenGLShader (Qt 5.0) 
-  * QOpenGLShaderProgram+  * QOpenGLShaderProgram (Qt 5.0)
  
 <code cpp> <code cpp>
Ligne 227: Ligne 290:
 ==== Buffers et objets ==== ==== Buffers et objets ====
  
-  * QOpenGLBuffer +  * QOpenGLBuffer (Qt 5.0)  
-  * QOpenGLFramebufferObject + QOpenGLFramebufferObjectFormat +  * QOpenGLFramebufferObject (Qt 5.0) + QOpenGLFramebufferObjectFormat (Qt 5.0) 
-  * QOpenGLTexture +  * QOpenGLTexture (Qt 5.2) 
-  * QOpenGLVertexArrayObject + QOpenGLVertexArrayObject::Binde+  * QOpenGLVertexArrayObject (Qt 5.1)
  
 ==== A trier ==== ==== A trier ====
  
-  * QOpenGLPaintDevice+  * QOpenGLPaintDevice (Qt 5.0) 
 +  * QOpenGLPixelTransferOptions (Qt ???)
  
 ==== Détails ==== ==== Détails ====
opengl_dans_qt5.1421287550.txt.gz · Dernière modification: 2015/01/15 03:05 par gbdivers