Mélanger OpenGL et QPainter avec Qt 4.5.x sous Sun Studio 12

| Andy Shaw | Guillaume Belz | Digia Qt |

Comme peu le savent déjà, il est possible de mélanger facilement du dessin avec OpenGL et QPainter avec l'aide de QPainter::beginNativePainting() et QPainter::endNativePainting().

Commentez

- Titre : Mélanger OpenGL et QPainter avec Qt 4.5.x sous Sun Studio 12

- Auteurs : Andy Shaw, Guillaume Belz, Digia Qt

- Parution : 25 février 2012

- Mise à jour : 21 mars 2012

- Licence : Copyright ® 2011 Digia. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. L'article original

- II. Le problème

- III. Une solution

- IV. Le cas Sun Studio 12

- V. Remerciements

I - L'article original

Cet article est une adaptation en langue française de Qt Commercial Support Weekly #4: Mixing OpenGL and QPainter + Qt 4.5.x with Sun Studio 12, d'Andy Shaw.

II - Le problème

Comme peu le savent déjà, il est possible de mélanger facilement du dessin avec OpenGL et QPainter avec l'aide de QPainter::beginNativePainting() et QPainter::endNativePainting().

On peut alors écrire du code comme celui-ci :

painter->beginNativePainting();
...
// opengl painting calls here
...
painter->endNativePainting();
...
painter->drawText(50, 50, "Ceci est un test");

Il affichera le texte après le rendu OpenGL. Dans la plupart des cas, cela fonctionne bien et ne posera pas de problèmes. Cependant, il faut surveiller une chose : si on change une option d'OpenGL après l'appel à beginNativePainting(), le rendu de Qt peut être affecté.

Un exemple parlant est l'option GL_DEPTH_TEST. Si cette option est activée après beginNativePainting(), le texte ne sera pas dessiné. En effet, Qt ne peut pas se rendre compte des changements d'état potentiels qui pourraient avoir eu lieu.

III - Une solution

Par conséquent, pour s'assurer qu'il n'y a pas d'effet négatif sur le rendu Qt, on doit réinitialiser les options d'OpenGL à leur état d'origine. On aura donc quelque chose comme :

painter->beginNativePainting();
...
glEnable(GL_DEPTH_TEST);
// opengl painting calls here
...
glDisable(GL_DEPTH_TEST);
painter->endNativePainting();
...
painter->drawText(50, 50, "Ceci est un test");

On utilise ainsi le test de profondeur dans OpenGL sans un impact sur le rendu du QPainter. Il y a quelques autres options à surveiller, couvertes dans la documentation de QPainter::beginNativePainting().

IV - Le cas Sun Studio 12

Un problème de compilation peut apparaître si on utilise Sun Studio 12 (CC 5.10) avec Qt 4.5.x.

CCC 5.10 n'est pas réellement une version prise en charge par Qt 4.5.x. Cependant, puisque les moyens de Digia le permettent, la question a été étudiée afin d'offrir le meilleur service possible aux clients.

Ce problème a été résolu ; les utilisateurs de Qt 4.5 sous Solaris peuvent soumettre une demande de support via le portail client pour récupérer le patch ad hoc.

Cela ne signifie toute fois pas qu'il est possible d'offrir un support officiel pour l'utilisation de Sun Studio 12 avec Qt 4.5.x, mais il fonctionne apparemment assez bien.

V - Remerciements

Merci à Thibaut Cuvelier et Fabian Piette pour leur relecture !