Les lissages Plat, Gouraud et Phong - Part III - Éclairage dans les jeux vidéo

Les lissages Plat, Gouraud et Phong

Suite à l exploration du lissage de gourand, gouraud shading, dans la partie précédente on s’intéresse maintenant au lissage de Phong, Phong Shading.

Bui Tuong Phong

Bui Tuong Phong, nom de famille Bui Tuong et prénom Phong, était un étudiant à l’Université de l’Utah à Salt Lake City. Ce n’est d’ailleurs pas une coincidence si c’était la même université que celle d’Henri Gouraud, l’université ayant abrité de nombreux pionniers du graphisme sur ordinateur.

Henri Gouraud avait popularisé le lissage qui porte son nom et qui interpolait une couleur calculée à chaque sommet d’un triangle. Cela fonctionnait suffisamment bien pour certaines scènes et certains modèles d’éclairage.. Mais une chose qui était évidente c’est que c’était inadapté pour un modèle d’éclairage plus avancé, en particulier un modèle qui peut reproduire les reflets spéculaires. En effet le modèle utilisé pour illustrer le lissage de Gouraud utilisait un modèle Lambertien (on y reviendra) qui a la particularité de varier relativement peu avec la lumière ou le changemenet de point de vue de l’observateur. Le reflet spéculaire est à l’inverse extrêmement changeant et dans certains cas quasi-ponctuel (réduit à un point).

Ci dessus est un rendu d’un modèle d’éclairage qui tient compte des reflets spéculaires d’une surface avec une source de lumière ponctuelle. Comme le reflet de cette lumière est relativement petit, le calcul de l’éclairage par sommet ne capture l’effet de surbrillance qu’occasionnellement ce qui cause un clignotement apparent. Ce clignotement n’est pas désirable dans ce cas. Il n’est pas possible de capturer cet effet de surbrillance - appelé highlight en Anglais - en se contentant d’un calcul d’éclairage par sommet, ou alors il faut augmenter considérablement la densité du maillage 3D au point où ça rendrait caduque tout gain gagné par une interpolation.

Phong Shading - Lissage de Phong

L’idée de Phong était donc de prendre une approche hybride. Plutôt que d’interpoler la valeur finale de l’éclairage sur le triangle, on peut interpoler la normale à la surface calculée initialement à chaque sommet. La normale, aussi appelé vecteur normal, est un raccourci pour représenter l’orientation d’une surface relativement plane. C’est ce vecteur normal qui est le plus souvent présent dans les calculs d’éclairage. En interpolant le vecteur normal cela donne la possibilité de faire un calcul d’éclairage par pixel plutôt que par sommet. Ce calcul d’éclairage par pixel va capturer les plus petites variations dans les reflets spéculaires.

Cela repose sur le fait que l’interpolation de la normale même si elle n’est pas parfaite est une approximation proche de l’orientation de la courbe sous-jacente. En supposant que l’on cherche à représenter un objet courbe comme la sphère de la vidéo ci-dessus.

En pseudo code ça pourrait donner cela :

pour chaque triangle ABC
calculer la normale Na du triangle au point A
calculer la normale Nb du triangle au point B
calculer la normale Nc du triangle au point C
pour chaque pixel(X,Y) appartenant au triangle ABC
Calculer les coordonnées barycentriques de (X,Y) au point A, au point B, au point C : Wa, Wb, Wc
normale au pixel (X,Y) = Wa * Na + Wb * Nb + Wc * Nc
couleur du pixel (X,Y) = éclairage (normale au pixel (X,Y) )

Voici une illustration du phong shading dans une scène simple :

Le lissage de Phong améliore la capture de la surbrillance spéculaire comme prévu, mais on peut aussi remarquer que le terme diffus de l’éclairage est lui aussi plus précis. C’est particulièrement facile à remarquer aux frontière de la partie éclairée et de la partie dans l’ombre de la sphère.

Le lissage de Phong même s’il a été inventé peu de temps après celui de Gouraud, a mis beaucoup de temps a être adapté au jeu vidéo. Si l’interpolation de la couleur est relativement simple à mettre en place dans les puces graphiques, celui de la normale et surtout le calcul précis de l’éclairage après interpolation au niveau de chaque pixel n’était pas trivial pour les accélérateurs simples des premières années.

Aux alentours de la sortie de la première carte accélératrice 3DFX, la Voodoo 1, les jeux ont commencé à tirer partie de l’interpolation de la couleur par pixel. Puis elles ont continué à se complexifier en ajoutant plusieurs unités de textures, plusieurs interpolateurs matériel de couleur (par exemple un interpolateur pour la couleur diffuse et un autre pour la couleur spéculaire), des profondeurs de couleurs plus étendues, etc.. Mais il manquait toujours quelque chose pour rendre le calcul d’éclairage par pixel vraiment possible. Ce n’était pas forcément juste une question de performance mais de capacité.

Ce n’est qu’à l’arrivée de puces relativement programmables, basées sur les shaders, que l’adoption fréquente d’un éclairage par pixel dans les jeux a pu se faire.

Doom 3 et son éclairage par pixel - reflets spéculaires
Doom 3 et son éclairage par pixel - reflets spéculaires

X2 the threat et son éclairage par pixel - reflets spéculaires
X2 the threat et son éclairage par pixel - reflets spéculaires

Depuis cette époque quasiment tous les jeux en 3D l’ont adopté (en ignorant certaines plateformes mobiles comme les téléphones portables qui ont marqué une régression temporaire, et en ignorant certains jeux qui persévèrent dans un style un peu plus rétro et low tech). On parle de lissage de Phong ou d’éclairage par pixel, Per Pixel Lighting en Anglais, au choix et parfois indistinctement. En théorie le lissage de Phong est le précurseur, inventé dans les années 70, mais l’éclairage par pixel est définitivement une continuation de la même idée. Dans un proche-moyen futur, les modèles d’éclairage seront de plus en plus complexes, aucune comparaison par exemple entre l’éclairage et le réalisme de Doom 3 et de ceux sortis plus récemment en 2015. Mais pendant que ces modèles se complexifient, les normales continueront d’être interpolées sur les triangles et les calculs d’éclairage continueront à se faire par pixel en prenant la normale comme principal argument. Et donc d’une certaine façon le lissage de Phong perdure.

Modèle Spéculaire de Phong

Il y a parfois une confusion dans le monde du graphisme sur ordinateur entre deux concepts distincts introduit par Bui Tuong Phong lors de sa thèse. Celui dont on a parlé ici est une méthode d’interpolation de normales sur un triangle. L’autre concept qui porte le nom de Phong est un algorithme d’éclairage qui modélise les reflets spéculaires de manière explicite par une fonction simple et empirique. C’est le modèle spéculaire de Phong ou Blinn-Phong (il existe des variantes) qui est aussi beaucoup utilisé dans les jeux vidéo. On en parlera plus tard. Ces deux concepts sont indépendants au point où l’on peut faire du lissage de Phong en utilisant un tout autre modèle d’éclairage que celui du spéculaire de Phong, et vice versa on peut utiliser un modèle spéculaire de Phong avec par exemple un lissage de Gouraud (le calcul spéculaire a donc lieu par sommet à la place d’être fait par pixel).

Comments

Leave your comment