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 />

Nous allons présenter les pBuffer et les Frame Buffer Object (FBO) à travers un exemple simple : nous allons <strong>des</strong>siner<br />

dans le Fragment Shader <strong>des</strong> cercles concentriques de différentes couleurs.<br />

2.3.1 - <strong>Utilisation</strong> de QGLPixelBuffer<br />

La classe QGLPixelBuffer permet de manipuler les pBuffer <strong>avec</strong> <strong>Qt</strong>.<br />

QGLPixelBuffer m_pbuffer;<br />

L'initialisation prend en paramètre la taille du buffer et le format utilisé. Le format correspond au format d'affichage<br />

de contexte OpenGL (il permet notamment l'activation du double buffering). La fonction format permet de récupérer<br />

le QGLFormat du contexte openGL courant.<br />

{<br />

heightmapWidget::heightmapWidget(QWidget *parent) :<br />

m_pbuffer(QSize(512, 512), format(), this)<br />

Cependant, dans notre cas, nous souhaitons créer un Pixel Buffer Object <strong>avec</strong> une taille identique au Frame Buffer<br />

Object, pour pouvoir comparer la différence de performance. Pour cela, on va créer Pixel Buffer Object sur le tas :<br />

{<br />

// QGLPixelBuffer* m_pbuffer;<br />

m_pbuffer = new QGLPixelBuffer(QSize(512, 512), format(), this)<br />

Nous allons maintenant générer une nouvelle texture dans laquelle sera stockée l'image produite. L'appel à la<br />

méthode generateDynamicTexture permet de générer une texture OpenGL de même taille que celle du pBuffer.<br />

L'identifiant de la texture est récupéré sous forme d'entier non signé dans la variable m_pbuffer_location.<br />

La méthode bindToDynamicTexture permet de lier le contenu du pBuffer à une texture : dès que le pBuffer sera<br />

modifié, la texture liée sera mise à jour automatiquement. Malheureusement, cette fonctionnalité n'est pas disponible<br />

sur toutes les plateformes, notamment Linux (serveur X11). Cette fonction retourne un boolean indiquant si cette<br />

fonctionnalité est prise en charge par le système. Si ce n'est pas le cas, il faudra effectuer manuellement la mise à<br />

jour de la texture après modification.<br />

- 39 -<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!