Dans le jeu vidéo, la grande règle c’est l’optimisation.
Rappelez vous du temps où l’on pouvait traverser le décor et se rendre compte
que le jeu vidéo est digne du carton pâte, on se serait cru dans un Dark City
de Alex Proyas avec la direction d’une pseudo ville qui s’arrête devant un mur
de brique. Cette année je travaille sur un moteur qui ne permet pas de
bénéficier des dernières techniques en terme d’effets visuels et c’est pourquoi
ma seule option est le normal map.
Le normal map kezako ?
En règle générale dans les jeux vidéos, les personnages sont modélisés en « low-poly ».
Cela signifie en gros que les faces qui composent un personnage modélisé en 3D se doivent d’être optimisées au mieux (comprendre nombre réduit). C’est l’une
des différences majeures avec l’animation 3D pure, ça, et le petit plus temps réel
des jeux. Vous pensez que FFXIII est magnifique ? Vous avez raison ! Mais
regardez les doigts des personnages, se sont des cubes ! Oui vous avez
bien entendu ! 4 faces sur les côtés, pas plus.
Alors comment peut-on faires des boucles de ceintures dans tous les sens sans
que ça fasse moche ? Des cicatrices ? Des écailles ? Une des
réponses est le normal map (car il y en a d’autres mais je ne parlerai ici que
de la normal).
La normal map est une texture qui va enregistrer la façon dont la lumière
réagit sur chaque partie de la texture, il s’agit donc également d’un « Shader »
par définition.
Ainsi, si une créature a la peau écaillée, la lumière se reflètera sur chacune
des écailles, et cela même si en réalité la surface est plane, ce qui donne une
impression de relief (Si vous voulez vous amusez, vous remarquerez que les
bandes avec des reliefs de smarties géants qui permettent d'éviter de glisser, ou presque, prêt des transports en commun ont en
fait l’air tout à fait plats, c’est l’ombre qui fait qu’on voit le relief !).
Le but va donc être de créer tout d’abord un model en low
poly. Ici je donnerai l’exemple avec le prédateur du projet Contamination (c’est
noël avant l’heure !).
On voit que le modèle fait 1508 triangles soit environ 750 polys (un poly= un
carré = 2 triangles. Une carte graphique gère tout sous forme de triangles). On
voit également que malgré cela il est relativement adouci. Il s’agit de ce qu’on
apelle les "groupes de lissages". Ils permettent dans un premier temps d’obtenir une réaction plus douce de la lumière sur un poly (Si on tord un carré en
deux , la lumière frapera l’arrête de manière brute). Cela explique également
les accidents que l’on peut voir au niveau de la lumière sur le model en exemple. Les
groupes de lissages ne sont pas corrects.
NB : Modéliser avec les groupes de lissage permet, quand on veut faire du
low poly de prendre conscience des endroits où il est véritablement nécessaire d’avoir plus de polys et ceux où l’on peut en économiser.

Ceci fait, on va réaliser un unwrap du model. Pour faire simple, c’est
comme la couture, il faut créer le patron pour la peau (skin) du model. Il y a
de nombreuses subtilités par rapport à cette étape mais ce n'est pas ce qui nous
intéresse dans l’immédiat.

Tout est prêt. On passe alors sur un logiciel qui va permettre d’augmenter considérablement le nombre de polys. Pourquoi ?
Ca semble aller à l’encontre même de l’optimisation ! Et bien non car en
réalité, les informations que l’on va sculpter seront, comme expliqué
précédemment, enregistrées sous forme de normal map. Evidemment il ne faut pas
espérer pouvoir rajouter un troisième bras ! Ce n’est pas magique non plus !
Par contre voici toutes les informations que j’ai pu ajouter sur le bestiau.

On a des écailles, des volumes pour les muscles, des plis de
peau et un model d’un peu plus de 3 millions de polys donc 6 millions de
triangles, pas question de faire tourner un personnage comme ça en temps réel
dans un jeu ! Pas de problèmes, on en extrait donc la normal map (pour ceux qui
tenterait l’expérience n’oubliez pas de sélectionner la bonne configuration,
genre 3Dsmax 7 tangent sous Zbrush, sans quoi vous vous retrouverez comme moi à pester
parce que les couleurs ne sont pas les bonnes).
Et voilà la jolie normal (ou presque jolie).

Les artefacts (erreurs) en vert sur l'exemple, ne sont pas très beaux à voir, mais il faut bien comprendre que ce qui n'est pas dans les uvs (les différentes pièces du patron) ne sera pas conservé. Il ne reste plus qu’à mettre tout ça dans le moteur :

Et voilà, le model que vous avez sous les yeux est bien le
même que le tout premier que vous avez vu, aucun poly en plus, le relief des
écailles vient uniquement de la normal map. Il a perdu du poids parce que les volumes rajoutés en high poly étaient trop importants et donc la lumière ne pouvaient pas à elle seule donner autant d'impression volume. Mais au final on obtient quelque chose de bien plus détaillé qu'avec une simple texture à plat, et on multiplie les détails de texture, variations de relief.
Il est important de noter que cet article n’est pas un tutorial complet,
tout d’abord parce que je ne pense pas être assez pédagoge et expérimenté pour
ça, et ensuite parce que dans les
moteurs actuels, la normal map à elle seule ne suffit pas. Un personnage actuel
dans un jeu, est en réalité composé de plusieurs autres couches comme la
spéculaire etc.
Quant à la texture de l'animal, elle a été réalisée dans des délais
assez bref et n’est pas « propre » (ce qui explique aussi pourquoi je
ne vous la montre pas en dépliée, il faudra suivre cela sur de futurs post de
Contamination).
Enfin, le moteur utilisé n’est pas le plus efficace en ce qui concerne les
graphismes actuellement. Mais je pense que cet article vous aura permis de
découvrir une petite parcelle des multiples astuces dont le jeu vidéo use pour
bluffer nos ptits yeux éblouis mais tant que ça marche, que demander de plus ?