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

...<br />

private:<br />

QVector m_vertexarray;<br />

};<br />

La méthode de remplissage du vecteur est similaire à celle présentée dans la partie précédente, sauf que les positions<br />

<strong>des</strong> vertices sont stockées dans un tableau créé lors de l'initialisation.<br />

void HeightmapWidget::initializeGL()<br />

{<br />

...<br />

for (int z = 0; z < quads_by_z; ++z)<br />

{<br />

for (int x = 0; x < quads_by_x; ++x)<br />

{<br />

int i = z * vertices_by_x + x;<br />

}<br />

}<br />

}<br />

m_vertexarray.push_back(m_vertices[i]);<br />

m_vertexarray.push_back(m_vertices[i+vertices_by_x]);<br />

m_vertexarray.push_back(m_vertices[i+1]);<br />

m_vertexarray.push_back(m_vertices[i+1]);<br />

m_vertexarray.push_back(m_vertices[i+vertices_by_x]);<br />

m_vertexarray.push_back(m_vertices[i+1+vertices_by_x]);<br />

L'affichage de ce tableau de données nécessite plusieurs étapes. Dans un premier temps, il faut indiquer à la carte<br />

graphique que l'on va travailler <strong>avec</strong> <strong>des</strong> Vertex Array à l'aide de la fonction glEnableClientState. Il faut ensuite<br />

envoyer le tableau de données contenant les vertices à la carte graphique à l'aide de la fonction glVertexPointer.<br />

Cette fonction prend trois paramètres : le nombre de composantes dans un vertex (trois dans notre cas), le type<br />

de données (<strong>des</strong> GL_FLOAT dans l'exemple) et un pointeur constant vers le tableau de données. La fonction<br />

glDrawArrays permet de <strong>des</strong>siner les triangles et prend comme paramètres le type de primitive (GL_TRIANGLES<br />

dans l'exemple) et le nombre de vertices.<br />

void HeightmapWidget::paintGL()<br />

{<br />

qglColor(<strong>Qt</strong>::white);<br />

glEnableClientState(GL_VERTEX_ARRAY);<br />

glVertexPointer(3, GL_FLOAT, 0, m_vertexarray.constData());<br />

glDrawArrays(GL_TRIANGLES, 0, m_vertexarray.size());<br />

glDisableClientState(GL_VERTEX_ARRAY);<br />

}<br />

2.0.3 - <strong>Utilisation</strong> <strong>des</strong> tableaux d'indices<br />

Dans le paragraphe précédent, nous avons mis en évidence un problème de duplication <strong>des</strong> vertices qui conduit à<br />

une augmentation de la taille du tableau envoyé à la carte graphique. Pour éviter cette surcharge inutile, il est possible<br />

d'utiliser notre tableau de vertices créé lors du chargement de la heightmap et de fournir un tableau d'indices indiquant<br />

l'ordre <strong>des</strong> vertices à utiliser pour <strong>des</strong>siner les triangles. Lorsqu'un vertex sera commun à plusieurs triangles, il suffira<br />

donc de dupliquer uniquement l'indice. Cette technique permet de réduire de façon non négligeable le volume de<br />

données à envoyer au processeur graphique et donc d'améliorer les performances.<br />

class HeightmapWidget : public QGLWidget<br />

{<br />

...<br />

private:<br />

QVector m_indices;<br />

};<br />

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