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