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

De plus, l'opérateur d'affectation étant privé, nous ne pouvons pas créer notre objet QGLFrameBufferObject dans<br />

la pile :<br />

class HeightmapWidget : public QGLWidget<br />

{<br />

private:<br />

QGLFramebufferObject m_fbo;<br />

public:<br />

HeightmapWidget(QWidget *parent) :<br />

QGLWidget(parent)<br />

{<br />

makeCurrent(); // OK : un contexte OpenGL est actif<br />

m_fbo = QGLFramebufferObject(512, 512); // erreur : l'affectation est impossible<br />

}<br />

};<br />

Il est donc indispensable de créer notre objet dans le tas sous forme de pointeur. On prendra les précautions<br />

nécessaires pour une gestion correcte de la mémoire, en n'oubliant pas d'appeler delete dans le <strong>des</strong>tructeur.<br />

class HeightmapWidget : public QGLWidget<br />

{<br />

private:<br />

QGLFramebufferObject* m_fbo;<br />

public:<br />

HeightmapWidget(QWidget *parent) :<br />

QGLWidget(parent)<br />

{<br />

makeCurrent(); // OK : un contexte OpenGL est actif<br />

m_fbo = new QGLFramebufferObject(512, 512); // OK : on affecte un pointeur<br />

}<br />

~HeightmapWidget()<br />

{<br />

if (m_fbo) delete m_fbo;<br />

}<br />

};<br />

Le Program Shader étant similaire à celui du chapitre précédent (les couleurs sont changées, pour voir la différence<br />

<strong>avec</strong> le Pixel Buffer Object), nous ne détaillerons que le code du rendu. L'utilisation <strong>des</strong> Frame Buffer Object ne<br />

requiert pas de changement de contexte OpenGL : nous appelons directement les métho<strong>des</strong> bind et release pour<br />

activer le rendu off-screen.<br />

void HeightmapWidget::paintGL()<br />

{<br />

m_program_fbo.bind();<br />

m_fbo->bind();<br />

...<br />

m_fbo->release();<br />

m_program_fbo.release();<br />

La texture générée est ensuite liée au contexte OpenGL pour l'affichage du terrain :<br />

glBindTexture(GL_TEXTURE_2D, m_fbo>texture());<br />

Le résultat final :<br />

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