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 :

 
Sélectionnez
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 :

 
Sélectionnez
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 !