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

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/

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

Saved successfully!

Ooh no, something went wrong!