Utilisation avancée des processeurs graphiques avec Qt
Utilisation avancée des processeurs graphiques avec Qt
Utilisation avancée des processeurs graphiques avec Qt
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
heightmapwidget.cpp<br />
}<br />
<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 />
QVector3D A = m_vertices[indexOfPoint(x, z)];<br />
QVector3D B = m_vertices[indexOfPoint(x_B, z_B)];<br />
QVector3D C = m_vertices[indexOfPoint(x_C, z_C)];<br />
QVector3D AB = B - A;<br />
QVector3D AC = C - A;<br />
QVector3D cross = QVector3D::crossProduct(AC, AB);<br />
cross.normalize();<br />
return cross;<br />
5.3.2 - Calcul <strong>des</strong> normales à l'aide de <strong>Qt</strong>OpenCL<br />
Dans cette partie nous allons utiliser OpenCL pour accelérer le calcul <strong>des</strong> normales, qui était auparavant réalisé coté<br />
CPU. La mise à jour <strong>des</strong> normales peut être utile dans le cas ou nous modifions dynamiquement les positions <strong>des</strong><br />
vertices du terrain.<br />
Pour ce faire nous utiliserons le module <strong>Qt</strong>OpenCL qui se présente sous la forme d'un plugin à telecharger et compiler.<br />
(voir article « Utiliser OpenCL <strong>avec</strong> <strong>Qt</strong> » http://qt-labs.developpez.com/bibliotheque/qtopencl/).<br />
<strong>Qt</strong>OpenCL gère plusieurs aspects d'openCL implicitement, dans le cadre d'une utilisation<br />
standard, le développeur n'auras pas à manipuler les mécanismes OpenCL « bas<br />
niveau » (platform, commad queue, ).<br />
La première chose à faire, au niveau du constructeur, est d'initaliser OpenCL et de lui préciser sur quel type de<br />
processeur parralèle les calculs vont s'effectuer. Le programme est ensuite compilé et en pointeur vers le kernel<br />
utilisé est récupéré.<br />
C++<br />
if (!GPUContext.create(QCLDevice::GPU))<br />
qFatal("Could not create OpenCL context");<br />
UpdateNormalsProgram = GPUContext.buildProgramFromSourceFile(QLatin1String(":/clprograms/updatenormals.cl"));<br />
UpdateNormalsKernel = UpdateNormalsProgram.createKernel("NormalsUpdate");<br />
Le calcul est implémenté dans une fonction : makeNormalsGPU(). Comme pour l'exemple d'addition de vecteurs, il<br />
est necessaire d'envoyer les données aux GPU, dans notre cas, les données en entrée sont les vertices composants<br />
notre terrain (gpu_in_vector) et les données en sortie sont un vecteur contenant pour chaque vertice, la normale qui<br />
lui est associée (gpu_out_vector).<br />
<strong>Qt</strong>OpenCL dispose d'une classe de base pour les buffers stockés sur le serveur (GPU) : QCLBuffer. Cette classe<br />
définit plusieurs opérations de bases telle que l'allocation, l'écriture, la lecture. Nous utilisons une classe héritant de<br />
QCLBuffer : QCLVector. Cette classe est l'équivalent d'un Qvector mais stocké sur la mémoire serveur.<br />
Le vecteur de sortie est allouer, ainsi que le vecteur d'entrée qui est ensuite remplis <strong>avec</strong> les vertices du terrain.<br />
cpp<br />
// Buffer setup<br />
QCLVector gpu_out_vector = GPUContext.createVector(num_normals,<br />
QCLMemoryObject::ReadWrite);<br />
- 73 -<br />
http://gbelz.developpez.com/remi-achard/gpu-avance-<strong>avec</strong>-qt/modified/