Guide - La création de textures pour les jeux vidéo avec Blender

Les grands secrets du texturing enfin révélés

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Nous allons voir dans ce guide comment réaliser une texture stylisée de qualité professionnel pour un jeu vidéo. Nous aurons besoin de combiner quatre types de texture qui nous permettront d'obtenir une image en nuance de gris qui servira de base pour ajouter de la couleur. La technique qui vous ai présenté vous permettra d'avoir une texture stylizé (un côté dessin animé 3D) similaire au jeu Overwatch.

J'ai réalisé un outil permettant de générer votre modèle de jeux et vos textures en un click ici: linko.projects.free.fr/gametools.zip

Les textures souvent utilisées dans les jeux vidéo

Les quatre textures dont nous auront besoin sont:

  • Ambiant Occlusion: l'ambiant occlusion va créer de l'ombre sur les zones proches et laissez blanc le reste cela va permetre d'avoir une ombre sur le modèle qui s'adapte à tous les types d'éclairage et d'améliorer le visuel du modèle.
  • Bent map: la Bent map n'est pas obligatoire, elle est utilisée pour simuler un éclairage directionnel, généralement du dessus comme celui émit par le soleil. Nous verrons comment en créer.
  • Normal map: la normal map va enregistrer les informations de relief de votre modélisation détaillé sur un version avec peu de polygones qui sera exporté dans le jeu. Elle sera utilisé pour simuler les reliefs et retrouver un maximum de détail tout en améliorant les performances.
  • Cavity map: la cavity map n'est pas indispensable, mais apporte un effet dessin à la main à votre modèle donc d'être dans le thème des jeux tel que Overwatch et Dota. Cette map permet aussi de mettre en avant les petits détails en les contrastant.

Préparation pour le baking

Avant de passer votre baking il vous faut:

  • un modèle high poly, une version détaillée qui n'est pas utilisée dans le moteur de jeu, mais seulement dans Blender)
  • un modèle low poly, c'est la version optimisée pour le moteur de jeu, vous devez avoir déplié ses UVs

Le margin des UVs

Quand vous dépliez les UVs avec U > Unwrap une option Margin sera visible dans le menu t de gauche vous demande d'indiquer un margin, c'est l'espace entre les UVs islands. Ouvrez l'UV/Image Editor pour voir les modifications sur vos UVs.

UV Margin

L'espace entre les UVs permettra de faire déborder la texture baker en dehors des UVs pour que les seams ne soient pas visibles.

Activer le baking GPU

Nous allons utiliser Cycles baking pour réaliser ses textures, car il permet d'utiliser la carte graphique et l'ambiant occlusion est de bonne qualité. Pour utiliser Cycles mettez Cycles Render en haut de l'interface au lieu de Blender Render. Pour activer le rendu GPU faite File > User Preferences… dans System activez CUDA. Ensuite dans les options à droite du moteur de rendu changez CPU par GPU à la ligne Device.

Les options de Cycles baking

Les options de baking ce trouve tout en bas du menu des options de Cycles.

Option: Selected to Active

Un paramètre indispensable c'est Selected to Active qu'il faut cocher pour projeter les détails sur la sélection active donc du high poly sur le low poly active (orange clair).

Pour qu'une sélection soit active il faut la sélectionner en deuxième. Faites un click droit sur votre high poly puis shift + click droit pour sélectionner votre low poly.

Option: le margin/edge padding

Le Margin dans les options de baking définit le nombre de pixels de débordement. Je vous conseille d'utiliser 10 pixels pour une texture en 2048x2048 et 20 pixels pour une map en 4096.

Option: la cage

La cage va réaliser une extrusion de votre low poly afin qu'il englobe entièrement votre high poly sans qui les intersections ne seront pas baké correctement. Il faut faire en sorte que la cage soit à peine plus grande que le high poly pour éviter les déformations. Pour savoir quelle valeur indiquer, je vous conseille d'appliquer un Solidify modifier, de mettre l'offset à 1 et d'ajuster le thinkness en maintenant shift pour changer la valeur avec précision. Copiez la valeur obtenue pour la cage puis supprimez le modifier.

Le Baking

Pour cette démonstration je vais ajouter Suzanne (le singe de Blender) pour le high poly et un plan pour le low poly comme ça vous pourrez suivre le tutoriel et faire la même chose que moi. Comme c'est un plan que j'ai placé de façon à ne pas avoir d'intersection avec le Suzanne je peux laisser la cage à 0 et le margin à 0. Réglez les samples pour le baking dans Render, par défaut la valeur est de 128. Pour la normale map et la bent map vous n'avez pas besoin d'une valeur élevé, 5 samples est suffisants. Pour l'ambient occlusion vous pouvez laisser 128, même si vous avez encore du noise je vous montrerez une technique plus bas pour le retirer.

Prenez l'habitude de sauvegarder vos images en .tga (targa), elles compressent sans trop dégrader l'image et permettent d'accéder à l'alpha channel (transparence) séparément contrairement au .png.

Vous devez créer une image sur laquelle baker puis attacher cette image dans un matériau. Ouvrez lme UV/Image Editor, cliquez sur New. Peut importe la couleur de l'image ou si elle est transparante ou non tnat que Clear est coché dans les options de baking. Le paramètre le plus important c'est la résolution, dans ce tutoriel je vais indiquer 4096x4096. Je vais l'appeler "4k".

En décochant Clear dans les options de baking l'ancienne image n'est pas effacé, c'est utile pour créé un sprite sur un plan et projeter plusieurs versions animé et sous différents angles de votre low poly.

Créer un nouveau matériau pour le low poly et faites Shift + a, Image Texture et indiquez le chemin de votre image sur lequel baké. Ne l'attachez pas aux autres node. Si vous avez plusieurs node Image Texture Cycles va baker sur le node actif, le dernier sélectionné.

Si les nodes n'apparaissent pas c'est que vous êtes en compositing node, dans le menu en bas vous avez View, Select, Add et Node et juste à droite trois icônes qui permettent de passer des nodes du matériaux à ceux du compositing.

Baking: normal map

Sélectionnez votre high puis le low poly en maintenant shift. Dans les options de baking il écrit Combined à la ligne Bake Type, mettez Normal, vérifiez que Space soit sur Tangent et les axes en +X, +Y et +Z.

Normal map

Baking: bent map

Pour la Bent map restez en mode de baking Normal, à Space mettez Object au lieu de Tangent. Pour les axes afin d'utiliser les mêmes que dans les autres logiciels de 3D mettez +X, +Z, -Y. Faites aussi un clear rotation avec Ctrl + a.

Bent map

La texture est identique à la normal map parce qu'elle est baké depuis un plan, mais avec un low poly plus complexe elle sera différente de la normal map.

Extraire la map de l'éclairage du dessus

Pour générer une map de l'éclairage du dessus, il faut séparer les couleurs et ne garder que le Green channel pour l'éclairage du dessus. Le Red channel donne un éclairage de la droite et le Blue de face.

Dans le node editor passez en mode compositing, activé le backdrop pour voir le résultat en fond. Créez un Image node en faisant Shift + a puis Input > Image, attachez le node à un Converter > Seperate RGBA, réliez la sortie G (Green) à un Output > Viewer. Vous pouvez aussi relier l'alpha du Separate RGBA à l'alpha du viewer node pour avoir de la transparence, mais celà ne changera rien sur le modèle 3D.

Eclairage du dessus obtenu en ne gardant que le Green channel

Pour sauvegarder l'image ouvrez l'UV/Image Editor et pour l'image mettez Viewer Node puis pressez F3 et sauvegardez votre image en targa. Mettez RGBA au lieu de RGB dans les options en bas à gauche pour préserver la transparence.

Eclairage du dessus avec le green channel de la bent map

Baking: ambiant occlusion (AO)

Dans le Bake Type mettez Combined, ajustez le nombre de samples du baking en fonction du noise. Je vais laisser 128.

Voici la map que j'obtiens:

Ambient Occlusion avant compositing (non final)

Améliorer l'ambient occlusion map

Par défaut l'ambient occlusion de Cycles n'est pas assez contrastés et a souvent du noise (grain). Créez un Image node et viewer node comme tout à l'heure. Ajoutez deux Color > RGB Curves entre. Sur la première à gauche cliquez dessus pour ajouter un point et mettez-y les coordonnés X: 0.65 et Y: 0.35 celà va contraster l'ambient occlusion. Pour le second RGB Curves cliquez sur Black Level, passez en mode HSV (Hue Saturation Value en français Teinte Saturation Brillance) et à V mettez 0.145 cela va permettre de rendre noir les parties gris foncées pour contrasté les bordures de la map. Voici à quoi ressemble pour l'instant la map, il reste à enlever le noise:

Ambient Occlusion contrasté

Pour retirer le noise, ajoutez un Filter > Bilateral Blur après les deux RGB Curves. Nous allons utiliser ce node pour flouter l'image, mais comme nous voulons que certains détails ne soient pas flouté (bordures, angles importants) vous allez ajouter un Image node, ouvrir votre Normal map qui contient les informations des angles et le connecter au Determinator du Bilateral Node. Par défault l'option space sigma pour l'intensité du blur est trop élevé, je vous conseil de mettre 0.5 au lieu de 5. Voilà à quoi comment sont connectés les nodes:

Nodes pour améliorer l'ambient occlusion map

La technique du bilateral noise peut être utilisé pour le baking de l'éclairage en mettant le bake type combined. Comme il ne sera possible de baker de normal map si Selected to Active n'est pas activé vous pouvez à la place utiliser une bent map.

Voici à quoi ressemble la version finale de notre ambient occlusion map:

Ambient Occlusion final composité

Compositing: Cavity map

Il n'est pas possible de baker une cavity map, nous allons utiliser la normal map et utiliser plusieurs nodes pour y extraire la map. Pour créer une cavity map nous allons créé un effet "Emboss", Photoshop permet de le faire directement dans Blender il faut créer utiliser une combinaison de nodes. J'espère qu'à l'avenir un Emboss node sera disponible. L'emboss va déplacer l'image dans une direction dans un certain nombre de pixel que vous aurez défini. Une image sera déplacée à gauche une à droite et un node identifiera les différences entre les deux images pour dessiner les arrêtes de l'image. Nous feront aussi celà en déplaçant l'image vers le haut et une autre version déplacé vers le bas mais pour cette version il faudra inverser les couleurs.

Dans le compositor de Blender importez votre normal map avec l'Image node. Pour inverser l'image il ne suffit pas d'utiliser un Invert node dans Blender il faut modifier le gamma sinon l'image pourrait en plus globalement s'assombrir ou devenir plus clair même avec un gris moyen (Value à 0.5/1).

Vous pouvez-vous appuyez sur l'image plus bas pour vous aider à créer vos nodes. Ajoutez un Color > Gamma. Créez un Converter > Math mettez le en mode Divide à la première ligne Value mettez 1 et à la seconde 2.2. Connectez-le à l'Input Gamma. Connectez le Gamma node à Concerter Separate RGBA. Ajoutez deux Distort > Translate, connectez le R channel à Image de chaque Translate node. Mettez X -0.5 pour un des nodes et X 0.5 (en déplaçant d'un demi-pixel de chaque côté on obtient un écart total d'un pixel). Créez un Color > Mix, attachez les deux images et passez en mode Subtract pour mettre en avant les différence entre les images. Attachez un Converter > Math en mode Add et mettez la valeur 0.5. Voilà à quoi ressemble nos nodes pour l'instant et le résultat que vous devriez avoir:

Cavity map en X extraite de la normal map

Ajoutez deux Translate node que vous connectez au green channel avec cette fois Y à 0.5 et l'autre à -0.5. Pour X mettez 0. Il faut faire ensuite la même chose qu'avant, connecter les deux nodes à un Subtract node puis à un Add node. Vous pouvez dupliquer les nodes avec Shift + d. La différence c'est que vous devrez ajouter un Color > Invert node après le Add node. Réunissez la cavity en X avec celle en Y avec un Color > Mix node en mode Overlay puis pour restituer le gris moyen d'origine mettez un node Color Gamma avec pour valeur 2.2.

La cavity map est quasiment terminé, si la résolution de baking est faible vous aurez un peu d'aliasing sur les arrêtes (effet escalier), pour retirer cet effet ajoutez un Filter > Blur node cochez Relative ce qui va permettre d'entrer non pas une valeur en pixel mais en % qui s'adaptera à toutes les résolutions d'image. Je mets 0.1 ou 0.05 pour ne pas trop flouter l'image et garder mes détails tout en enlevant le plus possible l'aliasing.

Nodes pour extraire une cavity map à partir d'une normal map Agrandir

Cavity map

Vous pouvez rendre la Cavity map plus visible en augmentant les valeurs de Translate. Au lieu de mettre 0.5 et -0.5 vous pouvez mettre 1 et -1.

Compositing des maps

Génération d'un grayscale

Nous allons combiner l'ambient occlusion, la map de l'éclairage du dessus et la cavity map extraite de la normal map pour générer une image en nuance de gris qui nous servira de base pour la texture. Je vous montrerai par la suite des techniques pour la colorer. La normal map ne sera pas utilisée pour le grayscale, elle sera appliqué directement sur le modèle pour simuler du relief.

Importez l'ambient occlusion, top lighting et cavity map dans le compositor. Vous allez griser l'ambient occlusion map, pour celà faite Color > Mix, mettez le node en mode Multiply, attachez l'image et replacez la couleur blanche par un gris moyen en passant en mode HSV et en entrant 0.5 pour la Value. Nous allons combiner l'ambient occlusion et le top lighting, créé un Color > Mix en mode Overlay, attachez en haut l'ambient occlusion et en dessous le top lighting. Utilisez le facteur pour rendre l'éclairage de dessus plus ou moins visible, si il est trop visible la texture ne sera pas réaliste si l'éclairage du jeu vient du dessous. Mettez une petite valeur comme 0.2. Combinez la Cavity map en mettant un Mix node de type Soft Light. La cavity map va assombrir votre texture mettez entre un Mix en Overlay mode avec une valeur à 1.4 pour que la cavity soit plus claire.

Voilà c'est déjà terminé nous avons la base de notre texture:

Les nodes pour générer un grayscale

Voici la base de notre texture:

Grayscale

Sauvegardez votre grayscale.

Prévisualiser son modèle de jeu

Plus qu'à passer aux couleurs, mais avant nous allons voir ce que donne le low poly avec sa texture appliquée.

Passez en mode de rendu Blender Render, sélectionnez votre low poly, supprimez son matériau et créez en un nouveau (l'autre ne fonctionnait qu'avec Cycles render). Allez dans l'onglet des textures. Cliquez sur New, chargez votre Grayscale.

Dans la vue 3D passez en mode Texture, l'icône ce trouve en bas à droite de Object Mode. Ajoutez une lampe.

  • Si la texture n'apparait pas ouvrez le menu n de la vue 3D, à shading changez Multitexture par GLSL.
  • Si vous souhaitez que votre texture soit transparante dans les options de la texture cochez tout en bas alpha et color dans Specular.

Importer la normal map en sélectionnant un nouveau slot de texture puis en cliquant sur New. Charger la texture et dans les options en bas décochez Color et Cochez Normal dans Geometry. Un peu plus haut dans Image Sampling cochez Normal map car Blender utilise la map comme une bump map par défaut (map en nuance de gris qui pousse le relief dans une seul direction).

Voilà ce que ça donne, pour rappel mon low poly est un plan, en important le grayscale et la normal map la lumière réagi comme si il y avait du relief pourtant tout est plat il n'y a qu'une seul face:

Test des textures sur le low poly

Pour l'éclairage j'utilise deux Hemi light celle orienté vers le bas avec une intensité de 0.4 et celle tournée vers le haut à 0.1 pour simuler le rebond de la lumière sur le sol. J'ai ajouté deux lampes une avec une couleur chaude orange et une avec une couleur froide bleu. J'utilise la Saturation du HSV pour régler l'intensité du orange et bleu.

Colorer le grayscale

Il y a plusieurs façon de colorer un grayscale, la plus simple serai de peindre une couleur et de la mixer en overlay et soft light. Les couleurs seront trop simples, en utilisant plutôt une color ramp (appelé aussi Gradients) vous aurez plusieurs couleurs qui changent selon le Value de gris.

Un exemple, en important votre grayscale dans le compsitor et en ajoutant un Converter > ColorRamp vous pourrez modifier la couleur qui sera affectée au noir jusqu'au blanc. Un exemple si je mets tout à gauche une couleur bleu, à droite une couleur rouge et que j'ajoute un curseur au centre en cliquant sur le "+" et qu'ensuite vous déplacez les curseurs vers la gauche un dégradé avec les couleurs utilisés entre les couleurs.

Fonctionnement d'une color ramp

Vous avez compris le principe, il faudra adapter le value pour que les parties noir aient des couleurs plus sombres. En sélectionnant des couleurs prises sur une image, par exemple en tapant Lava sur Google, j'ai recréé un effet de lave sur Suzanne. Voilà ce que ça me donne, imaginez un peu devoir le peindre, vous gagnez beaucoup de temps avec cette technique:

Effet de lave

Pour récupérer les couleurs d'une image ouvrez l'UV/Image Editor, passez en Paint mode et ouvrez le menu T. Placez le curseur sur la couleur à récupéré puis pressez s, la couleur dans le menu de gauche sera mise à jour, mettez le curseur au dessus et pressez Ctrl + c pour la copier. Revenez dans le compositor, sélectionnez le curseur auquel appliqué la couleur et faite Ctrl + v au dessus de la case pour la couleur.

Les masques

La gradient map s'applique sur tout l'image, mais vous pouvez utiliser un mask pour ne l'utiliser que sur une partie et créer plusieurs matériaux (une partie pour la peau, une autre pour les yeux, etc.).

Pour créez un map allez dans le UV/Image Editor, affichez la texture du viewer node ou le grayscale et passez en mode Mask au lieu de View ou Paint. Pour créer les points du mask il faut faire un Ctrl + click gauche, si vous maintenez le click et déplacez la souris vous créerez une courbe. Pour changer le type de point vous pouvez en sélectionner un puis appuyer sur V, le type Vector fera une ligne droite et Aligned Single une courbe. Le mask est automatiquement fermé entre le premier et dernier point. Pour créer un nouveau mask désélectionnez les points avec la touche a et placez de nouveaux points.

Pour utiliser le masque dans le compositor faites Input > Mask. Sélectionnez votre masque en cliquant sur l'icône bleu du node, cochez Anti-Alias pour limiter l'effet escalier, changez Scene-Size par Fixed et entrez la résolution de l'image. Pour l'utiliser ajoutez un Color > Mix node, attachez le Mask node pour le factor, pour la première image mettez l'image précédente en dessous, dans notre cas c'est la source le grayscale. En mettant l'image précédente, cela permettra de combiner plusieurs gradients. Le node ColorRamp doit lui toujours être connecté à la source qui est le grayscale:

Utilisation des masques

Vous pouvez uniquement avec les gradient colorer entièrement votre modèle. Je vous conseille de créer une collection de color ramp à réutiliser dans vos projets. Pour importer un node d'un autre projet créez d'abord un groupe avec Ctrl + g et nommez-le ça vous permettra de l'utiliser dans d'autre projet. Pour l'importer faites File > Append, entrez dans le .blend , dans NodeTree et sélectionnez le groupe. Pour le créer dans le compositor faite Shift + a vous le verrez dans Group.

Vous pouvez utilisez un Color > RGB Curves pour ajuster le contraste de vos couleurs.

Bonus: effets visuels

Nous allons voir comment ajouter quelques effets sur notre texture pour l'améliorer.

Effet de global illumination

Nous allons simuler un éclairage extérieur en utilisant notre image d'éclairage du dessus.

Eclairage du ciel

Pour simuler l'éclairage du ciel c'est très simple, récupéré un photo avec des couleurs de ciel intéressantes pour les récupérer dans votre Converter > ColorRamp. Attachez le ColorRamp à l'image Top Lighting et ajoutez un Color > Hue Saturation Value pour saturer l'image en réduisant la valeur de Saturation à 0.5 par exemple au lieu de 1. Pour l'ajouter au Grayscale utilisez un Color > Mix en mode overlay et modifiez son factor, je le mets à 0.4.

Eclairage du ciel

Eclairage du sol

La lumière rebondie sur le sol il nous faut éclairage par le dessous. Notre texture Top Lighting peut éclairé du dessous simplement en inversant les couleurs avec un Color > Invert. Récupérez une image avec ce que vous voulez comme type de sol: de l'herbe, du bois, etc et mettez les couleurs dans un nouveau ColorRamp attaché au Invert Node. Mixez l'image précédente en mode overlay avec l'éclairage du sol, mettez une plus petite valeur que pour le ciel en factor, je mets 0.1.

Faux Global Illumination

Vous pouvez conneter l'image colorée au premier Mix node pour avoir le global illumination et les couleurs à la fois:

GI avec couleurs

Ajouter de la terre

Pour ajouter de la terre nous allons combiner l'ambient occlusion et le top lighting celà permettra d'avoir de la terre dans les creux mais aussi sur le dessus de la surface pour plus de réalisme. Utilisez un Overlay à 1 en connectant l'ambient occlusion au dessus. Ajoutez un Filter > Filter et mettez le mode Sobel celà va mettre en avant les arrête du modèle en blanc. Connectez-le ensuite à un ColorRamp pour lui mettre une couleur de terre clair (beige) sur le curseur de droite. Pour le curseur de gauche mettez un blanc avec une value à 0.735 pour qu'il ne modifie pas l'image (pour ne pas la rendre plus claire ou plus sombre). Puis ajoutez un Filter > Blur en mode Relative avec 0.2 en X et Y. Voilà ce que vous devriez obtenir:

Effet de terre

Utilisez un Overlay pour combiner la terre avec le grayscale coloré avec le Global Illumination. Le factor détermine la quantité de terre.

Terre et couleurs

Voici notre texture finale:

Texture finale

Effet de Cell Shading

Pour créé un effet Cell Shading placez un ColorRamp juste après le grayscale en mode Constant au lieu de Linear et placez plusieurs nuances de gris:

Effet Cell Shading

Cette technique permet aussi de donner un effet mal compressé comme dans les jeux rétro et donner un certain style à sa création.

Bonus: réduire la taille d'une image et changer son ratio

Le baking ce fait souvent en 4096x4096 ou en 2048x2048, mais ces résolutions sont trop élevées pour des jeux vidéo (sauf pour une lightmap). Dans le compositor il faut utiliser un Distort > Scale node, vérifiez que vous êtes en mode Relative. Pour passer d'une image à 4096 à 1024 il faut diviser la taille par 4 donc mettez 0.250 pour X et Y. L'image est redimensionnée, mais pas ses bordures, elle fait toujours 4096. Vous devez ajouter un Distort > Crop et cocher Crop Image Size. Pour calculer comme supprimer les il faut diviser en deux la taille total de l'image donc 2048 et diviser par deux la taille de la nouvelle image 512. Ensuite il faut retirer 512 à 2048 pour la bordure de gauche et du bas et ajouter pour celle du haut et de droite. J'ai fait un schema:

Calculs pour réduire la taille d'une image

Bonus: inverser les couleurs d'une image

Par défaut si vous n'utilisez que le Color > Invert de Blender l'image deviendra globalement soit trop clair ou trop foncé même en utilisant un gris moyen qui ne devrait normalement pas changer. En inversant les couleurs du grayscale l'image devient beaucoup trop clair:

Problème d'inversion des couleurs sur le grayscale

Pour inverser les couleurs on va toujours utiliser le Invert node mais utiliser d'autres nodes en même temps. Nous l'avions pour pour inverser le Green channel de la normal map pour générer une cavity map.

Pour inverser les couleurs il faut modifier le gamma, inversez puis restaurez le gamma. Il faut créer un node Color > Gamma et attacher l'image à inverser dans Image et attacher en dessous un Converter > Math en mode Divide avec à la première ligne 1 et à la seconde 2.2. Ensuite mettez un Color > Invert node puis un autre node de gamma avec pour valeur 2.2.

Les couleurs ont bien été inversées:

Couleurs bien inversées

Édité par Linko

Knowledge has to be FREE - it's better to find another source of revenue beside than selling it

+4 -0
Auteur du sujet

Oui je vais tout envoyer à la validation, là ça permet à ceux qui sont en vacances d'accéder à mes cours.

Knowledge has to be FREE - it's better to find another source of revenue beside than selling it

+2 -0

Sinon, y’a un truc super qui s’appelle la bêta, et qui permet de mettre à disposition des gens un tuto ou article pendant qu’il est en validation. Et ce qui est encore mieux, c’est que du coup, les gens peuvent donner leur avis et contribuer à améliorer le contenu. Alors que là, y’a des tas de relecteurs qui ne le verront pas, parce qu’il n’est pas au bon endroit pour ça…

#JeSuisGrimur #OnVautMieuxQueÇa

+4 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte