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.

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

2.2 - Ajouter <strong>des</strong> lumières et <strong>des</strong> textures<br />

Les shaders sont un formidable outil mis à disposition <strong>des</strong> développeurs pour personnaliser le rendu 3D. Le but de<br />

ce tutoriel n'est pas d'entrer en détail dans les techniques les plus <strong>avancée</strong>s de rendu 3D mais d'illustrer l'utilisation<br />

<strong>des</strong> shaders. Nous allons présenter deux exemples simples de shaders : un modèle d'illumination de Phong et<br />

l'utilisation de textures. Ces exemples, bien que basiques au regard de la puissance <strong>des</strong> shaders, sont un bon moyen<br />

de se familiariser <strong>avec</strong> certains concepts courants en programmation 3D et <strong>avec</strong> l'utilisation <strong>des</strong> shaders. Le lecteur<br />

désirant approfondir ce domaine se reportera aux références données.<br />

2.2.1 - Le modèle de Phong<br />

Le modèle d'illumination de Phong est un modèle empirique décomposant la lumière en trois composantes :<br />

• la composante ambiante : correspond à l'éclairage ambiant de la scène, provenant de la réflexion multiple ;<br />

elle est constante pour chaque vertex ;<br />

• la composante diffuse : correspond à la lumière incidente sur l'objet 3D et partant dans toutes les directions ;<br />

elle ne dépend que de l'angle d'incidence entre le vecteur lumière et le vecteur normal ;<br />

• la composante spéculaire : correspond à la lumière réfléchie sur l'objet 3D ; elle dépend de l'angle d'incidence<br />

et de l'angle de réflexion entre le vecteur normal et le vecteur observateur.<br />

(source : Wikimedia Commons)<br />

Le détail <strong>des</strong> calculs mathématiques ne sera pas donné ici. Nous allons par contre expliquer à quoi correspondent<br />

les différents vecteurs utilisés. Pour chaque vertex, trois points dans l'espace 3D sont pris en compte : la position de<br />

l'observateur et la position de la lumière, qui sont constantes pour tous les vertices, et la positon de chaque vertex. Le<br />

vecteur observateur correspond au vecteur allant du vertex à l'observateur. Le vecteur lumière correspond au vecteur<br />

allant de la lumière au vertex. Le vecteur normal correspond au vecteur partant du vertex et perpendiculaire à la<br />

surface. Le vecteur réfléchi correspond au vecteur symétrique du vecteur lumière par rapport au vecteur normal. Tous<br />

ces vecteurs doivent être normalisés avant utilisation. Le langage GLSL fournit la fonction normalize() dans ce but.<br />

Il faut donc fournir de nombreuses informations aux shaders pour ce modèle d'illumination : les couleurs <strong>des</strong> lumières<br />

(ambiante, diffuse et spéculaire) et <strong>des</strong> matériaux, la position <strong>des</strong> lumières, la position de l'observateur et les vecteurs<br />

normaux à la surface pour chaque vertex. Pour les vecteurs normaux, nous utiliserons une Normal Map, c'est-àdire<br />

une image pour laquelle chaque composante de la couleur (rouge, vert, bleu) correspond aux composantes du<br />

vecteur normal (x, y, z), chaque pixel correspondant à un vertex. Dans la troisième partie de ce tutoriel, sur le calcul<br />

GPGPU, nous présenterons en détail le calcul de vecteurs normaux et la génération de cette Normal Map.<br />

2.2.2 - Chargement de la Normal Map<br />

Chaque coordonnée étant stockée dans une image au format RGB donc normalisé entre 0 et 255, il suffit de<br />

normaliser ces coordonnées entre -1 et 1 pour avoir les coordonnées en 3D. Le code ne présente pas de difficulté<br />

particulière et est très similaire au code de chargement <strong>des</strong> vertices.<br />

vertex_shader.gl<br />

img = QImage(":/normals.png");<br />

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