26.06.2013 Views

Utilisation avancée des processeurs graphiques avec Qt

Utilisation avancée des processeurs graphiques avec Qt

Utilisation avancée des processeurs graphiques avec Qt

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Utilisation</strong> <strong>avancée</strong> <strong>des</strong> <strong>processeurs</strong> <strong>graphiques</strong> <strong>avec</strong> <strong>Qt</strong> par Rémi Achard Guillaume Belz<br />

présentés dans ce chapitre et un exemple de Geometry Shader (uniquement à partir de la version 4.7 de <strong>Qt</strong>) sera<br />

présenté dans le chapitre suivant.<br />

Chaque shader s'applique à un élément de base (par exemple, un vertex pour les Vertex Shader et un pixel pour<br />

les Fragment Shader). Une particularité est que le code <strong>des</strong> shaders est exécuté à l'identique pour chaque élément<br />

de base, indépendamment les uns <strong>des</strong> autres (ce qui implique que le code d'un shader qui s'exécute pour deux<br />

éléments différents ne peut pas échanger de données entre eux ; par contre, deux shaders de types différents peuvent<br />

échanger <strong>des</strong> données entre eux, dans l'ordre d'exécution du pipeline, via l'intermédiaire <strong>des</strong> mémoires <strong>graphiques</strong><br />

partagées). Ce concept est appelé "programmation parallèle". Les cartes <strong>graphiques</strong> sont spécialement conçues<br />

pour profiter de cette particularité : les <strong>processeurs</strong> <strong>graphiques</strong> sont en fait constitués de plusieurs cores, chacun<br />

pouvant exécuter un shader sur un élément. Plus le processeur contient de cores, plus le temps d'exécution globale<br />

sera diminué (bien sûr, d'autres éléments <strong>des</strong> <strong>processeurs</strong> <strong>graphiques</strong> interviennent sur les performances).<br />

Dans cette partie, nous allons réécrire le programme de rendu de terrain pour qu'il utilise le pipeline programmable<br />

et présenter les outils de manipulation de shaders mis à notre disposition par <strong>Qt</strong>. Nous ne donnerons pas la version<br />

OpenGL du code, qui peut être trouvée dans le tutoriel de LittleWhite.<br />

2.1.1 - La manipulation de shaders <strong>avec</strong> <strong>Qt</strong> : QGLShaderProgram et QGLShader<br />

Dans <strong>Qt</strong>, les shaders sont gérés principalement <strong>avec</strong> deux classes dans <strong>Qt</strong> : QGLShaderProgram et QGLShader.<br />

• La classe QGLShader permet de manipuler les différents types de shaders, que ce soient les Vertex Shader,<br />

les Geometry Shader ou les Fragment Shader. Les shaders étant un code exécutable sur le processeur<br />

graphique, il faut fournir ce code sous forme de chaîne de caractères puis le compiler. Pour créer un shader,<br />

il suffit donc de créer un QGLShader en spécifiant le type de shader puis de compiler le code <strong>avec</strong> la fonction<br />

compileSourceCode (si l'on souhaite donner directement le code sous forme de chaîne de caractères) ou<br />

compileSourceFile (si le code est fourni dans un fichier séparé). On parle habituellement de compilation<br />

à la volée (Online compilation). Les dernières versions d'OpenGL permettent de sauvegarder et charger<br />

directement du code GLSL, sans avoir besoin de recompiler à chaque exécution (Offline compilation). Cette<br />

fonctionnalité n'est pas prise en charge nativement pour le moment dans <strong>Qt</strong>.<br />

• La classe QGLShaderProgram permet de manipuler un programme OpenGL, c'est-à-dire plusieurs<br />

shaders liés entre eux pour former un pipeline programmable spécifique. Il ne peut y avoir au maximum<br />

qu'un seul shader de chaque type par programme et qu'un seul programme actif en même temps. Cette<br />

- 23 -<br />

http://gbelz.developpez.com/remi-achard/gpu-avance-<strong>avec</strong>-qt/modified/

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!