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

cpp<br />

QCLVector gpu_in_vector = GPUContext.createVector(num_vertices,<br />

QCLMemoryObject::ReadOnly);<br />

gpu_in_vector.write(m_vertices.constData(), num_vertices);<br />

Le kernel est ensuite appelé, num_vertices threads éxecuteront en parralèle ce kernel, c'est à dire un thread par<br />

vertice. Ce nombre est indiqué àl'aide de la fonction setGlobalWorkSize de la classe QCLKernel.<br />

Le kernel est lancé directement sans appel de fonction, grâce à une surcharge de l'opérateur () de la classe<br />

QCLKernel. Notre kernel prend 4 arguments :<br />

• Pointeur vers le buffer de vertices (entrée)<br />

• Pointeur vers le buffer de normales (sortie)<br />

• Nombre de vertices<br />

• Largeur du terrain (pour trouver les positions <strong>des</strong> vertices voisins dans le buffer)<br />

cpp<br />

// Kernel launch<br />

UpdateNormalsKernel.setGlobalWorkSize(num_vertices);<br />

QCLEvent event = UpdateNormalsKernel(gpu_in_vector, gpu_out_vector, num_vertices, vertices_by_x);<br />

event.waitForFinished();<br />

N'oublions pas de libérer les buffers alloués sur le GPU.<br />

cpp<br />

// Release buffers<br />

GPUContextGL.release(gpu_in_vector);<br />

GPUContextGL.release(gpu_out_vector);<br />

Le calcul est effectué à chaque passage dans la fonction paintGL(). Les normales étant stockées à l'aide VBO, le<br />

contenu du VBO est mis à jour.<br />

cpp<br />

// Update normals<br />

if(normal_on_gpu)<br />

makeNormalsGPU();<br />

else<br />

makeNormalsCPU();<br />

normal_buffer.bind();<br />

normal_buffer.write(0, m_normals.constData(), sizeof(QVector4D) * m_normals.size());<br />

normal_buffer.release();<br />

Voici le code du kernel :<br />

cl<br />

//-----------------------------------------------------------------------------------------------------------<br />

//----------------------------------------------------------------------------------------------------------bool<br />

nearXmin(const int index, const int width)<br />

{<br />

return ((index % width) == 0);<br />

}<br />

bool nearXmax(const int index, const int width)<br />

{<br />

return ((index % width) == (width - 1));<br />

}<br />

bool nearYmin(const int index, const int width)<br />

{<br />

return ((index / width) == 0);<br />

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