Unity_Logo

Les outils graphiques disponibles

important.jpg

Une vue d’ensemble d’une partie des outils disponibles et de leur cout, toutes plateformes confondues.
Puis aussi des idées de base à connaitre.

Par outil graphique je parle autant des outils d'optims que des techniques graphiques pures. Souvent, une technique graphique est aussi une optimisation.

En général, les outils disponibles seront expliqués par les ingés moteurs, mais la mise en oeuvre de ces outils appartient aux graphistes.

J'ai organisé ça de manière arbitraire, certains élements appartiennent à plusieurs catégories, mais je ne les fais pas apparaitre plusieurs fois.

Table des matières :

1. Modélisation
2. Textures
3. Lighting, Shading
4. Animation
5. Effets 2D, filtres
6. Effets volumétriques, particules, etc...

1. Modélisation
Il faut savoir que dans un vertex, il y a en général : ses cordonnées, la couleur et alpha(RGBA), ses normales, ses coordonnées UV, du bone weight, etc…
Concernant le poids en mémoire, ce qui importe, c'est le vertex, pas la face.

En général le rendu de surface de base est le triangle, il existe aussi les quads, les nurbs, mais au final, ils seront toujours transformés en triangles pour être rendus. Le triangle est la plus petite surface existante qui soit totalement plane.

Level Of Detail :
La géométrie d'un objet est remplacée par une autre d'un niveau de détail moins élevée en fonction de la distance avec la caméra.
Permet d'économiser en triangles a afficher, fait gagner du frame rate, en contrepartie, occupe plus de mémoire et de bande passante.
Sur Shadow of the Colossus, les colosses n'ont pas de LOD par manque de mémoire pour les stocker.




img2,3,4 =  3 niveaux de LOD dans RE5

La tesselation dynamique : paut être à la fois un atout graphique et aussi une optim si utilisée comme remplacement des LOD. Elle permet un véritable Displacement Mapping opmtimisé selon la distance à la caméra.
Donne moins de travail que la création de LOD à la main, offre plus de détails de manière automatisée, mais demande beaucoup de calcul. Direct 3D 11 permet de porter le calcul sur le GPU. N'est utilisable que sur PC, XBOX360, PS3 car trés gourmand. C'est un Geometry shader.




La Sectorisation : Séparer en secteurs les zones d'une map et en déclancher l'affichage uniquement lorsqu'elle sont "visibles" par le joueur. Cela permet de gagner du frame rate.
Cela peut permettre de placer plus de détails dans zones fermées par exemple.

Ex : en zone 1, seules les zones 1 et 2 sont actives. En zone 2, les zones 1, 2 et 3 seront actives. En zone 3, seules les zones 2, 3 et 4 le seront, etc...
A noter, l'utilisation de zones de transition pour éviter de voir le reste(tunnels, coudes, passages leger en terme de géométrie...).


2. Textures
Textures mipmapping, texture filtering :
 
L’objectif du mipmapping est d’essayer de conserver des texels (les éléments de la texture) d’une taille la plus proche possible d’un pixel affiché à l'écran, sans quoi tout devient flou et incompréhensible avec la distance ou l'écrasement de la perspective.

Il existe 3 types de filtrage : Point, Bilinear, Trilinear. Le niveau anisotropique(qui influe directement la qualité du rendu de la texture) est reglable pour le bilinear et le trilinear filtering.

Point = aucun filtrage, Bilinear = deux niveaux de mipmap, transition assez violente, texture vite floue, Trilinear = 3 niveaux, plus doux. Niveaux anisotropique = permet de garder un piqué dans le détail de la texture quand la vue est rasante et que la texture s’écrase par perspective.

L'ordre de cout de ces techniques en commençant pas le moins cher : Point, bilinear, trilinear. Et un haut niveau anisotropique.




Les textures avec Alpha :

Trois types de rendu possible, du moins cher au plus cher : Opaque, Clip Alpha et Alpha  (Dans Unity, Normal, TransparentCutOut, Transparent)
Pour les textures transparentes, utiliser le ClipAlpha le plus possible.



La compression des textures :

Avec une compression S3TC, plus on réduit en nombres de bits, moins la texture est nuancée et plus on va vers un camailleux.
Aujourd'hui les types de compression les plus utilisés sont DXT5 et DXT1.




Le streaming de texture :

Se fait au niveau moteur, le graphiste a peu d'influence la dessus. On load du disque dur ou DVD, la texture de plus en plus grande qualité au fur et a mesure qu’on s’approche d’elle, peut remplacer le mipmapping. En gros les LowMips restent en mémoire et seuls les HiMips necessaires sont dynamiquement et selectivement loadés et unloadés.


3. Lighting, Shading
Bien qu'il soient intimement liés, il faut faire la difference entre le lighting et le shading : Light c’est la quantité de lumière et ses qualités. Et le shading c’est la description des propriétés d’une surface/matière et donc de la manière dont la lumière va agir, se diffuser sur cette surface…

Les ombres précalculées : VertexPaint, Plaques d'alpha, Lightmaps. (Du moins cher au plus cher)
Dans Unity, il y a aussi les light cookies, une texture assignée à une lampe.





Img 1,2,3 = Lightmaps - Img 4 = Vertex Paint - Img5 = Light Cookie

Les ombres temps réel : Pastille(plaque alpha parentée a l'objet), Shadowmaps, Stencil Shadows, SoftShadows Shadowmaps, etc (du moins cher au plus cher)




Img 1 = pastilles - Img2 = Shadowmap - Img3 = Stencil Shadow

Il faut savoir qu’un 2eme set d’UV est crée pour les Lightmaps.

ATTENTION : sur un objet avec peu de vertex, le vertex lighting est ok, par contre sur des objets plus complexes (next gen), il vaut mieux utiliser les lightmaps, ces moteurs sont optimisés pour. Vertex lights est toujours en mémoire VS Lightmaps streamées.
Avec le deferred lighting/shading/rendering, le nombre de lights temps,bien que chaque light coute une passe, devient moins problematique, car gérées différement.

Les shaders du moins au plus cher à rendre : Lambert et Phong, puis anisotropic, puis pixel shaders
Le cartoon shader est un mystere pour moi en terme de cout. Il est HW sur la DS.



Img1 =  Lambert, Phong,  Cartoon - Img2 =  Shaders Anisotropiques -  Img3 =  Pixel Shaders (reflexion, refraction,  normal maps, etc...)


Optim : avec la distance, on désactive des shaders sur les modèles

L'occlusion ambiante, une technique de rendu d'ombres douces appartenant aux méthodes d'illumination globale :

Première technique, l'Amb Occ pré calculée et bakée : peu couteux en CPU, peut être baké dans les lightmaps(la radiosité aussi), par contre pas dynamique.

Deuxième technique, l'Amb Occ rendue en temps réel(Screen Space Ambiant Occlusion, flitre 2D) : couteuse en CPU, mais temps réel donc fonctionne avec les objets dynamiques.

Pour baker l'Occ Amb, deux solutions : textures avec UV(lightmaps) ou Vertex paint



Img1 =  Occ Amb bakée au vertex -  Img2 =  Occ Amb bakée dans une texture - Img3 = Screen Space Ambiant Occlusion


- Les pixel shaders -

Les pixels shaders peuvent influencer le rendu de la géométrie(des normales) ou la réaction de la surface elle même.

Les shaders qui touchent à la géométrie :

Du plus rapide au moins rapide à rendre : bumpmap/normalmap, parallax, Displacement(spécial celui là, au pixel ou au vertex), le true bump mapping avec tesselation(DX11)

La normal map réoriente les normales au niveau du pixel. Parallax et Disp fonctionnent aussi comme ça.
Sur Unity un shader appartient à cette catégorie en plus des autres cités : le Diffuse Detail Shader qui propose une Detail Map, mais il touche à la texture diffuse et non au rendu de la géométrie.




img1 = mesh de base, img2 = mesh + normal map appliquée, img3 = fonctionnement des normal maps, img4 = Parallax Mapping, img5,6,7 = true bump map avec tesselation dynamique

Les autres shaders :

SubSurfaceScattering : phénomène de penetration de la lumière au travers d’un volume translucide. Prend en compte la diffusion de la lumières dans le materiaux qui varie selon les propriété de du materiau.



Relexion : en général, une cube map est générée en lowdef puis mappée en cam angle.

Refraction : déformation au pixel de l’image




- Deux exemples de techniques existant pour simuler l'illumination globale en temps réel -

Irradiance Volumes et  Spherical Harmonics : la map contient des infos de GI sous forme de grille en volume, une cage autours des objets dynamiques récolte les infos de GI et teinte les objets.







La Screen Space GI : nouveau ça, si j'ai bien compris, analyse l’image purement en 2D avec les passes de zdepth, normals, edge detect, etc... et parvient à calculer de la radiosité en temps réel avec ces infos... Plus d'infos ici : http://www.mpi-inf.mpg.de/~ritschel/SSDO/







4. Animation
Motion Capture

IK - FK

Morphs

Animation procedurale(Unity ok)

Swap de normal maps



RE5 : Sans et avec les normal maps d'anim

Engine physics, Havock, etc… : Ragdolls, physics emulation(gravité), collisions, jointures détachables(ik brisé boule + chaine, boule séparée, mais chaine a toujours IK), detection des collisions…




5. Effets 2D / Filtres
Motion Blur : en general utilise le frame buffer, voir exemple Lost Planet, une map de vecteur qui permet de compositer les images du frame buffer. (Unity)



img1 = les passes utilisées dans  Lost Planet pour calculer le motion blur, img2 = le resultat

Depth of Field : en general utilise le zbuffer. Ex LostPlanet : zbuffer, tache d’extraire des secteurs qui seront rendus en plus basse def. (Unity)



ScreeSpaceAmbantOcclusion : edge detection, Zbuffer, etc (Unity ok)



img1 = SSAO dans Unity - img2,3,4 = Passe SSAO, Passe de base, base+SSAO

Fog : brouillard ou perspective atmospherique

Le rendu HDR(2D filter), système d’exposition automatique de l’image. (Unity - Contrast Stretch Image Effect + Glow)


img1 = expo faite sur l'exterieur - img2 = expo faite sur l'interieur

Les filtres de correction de couleurs et autres effets. (Unity)




6. Effets volumétriques, particules, etc...
Particules : Les particules, en general, des sprites qui evoluent en face to cam. Permet de generer des effets volumetriques, feu, fumée, neige, pluie, etc...



Fur Shader : map de normales et de taille, diffuse



img1 = passes utilisées pour generer le fur - img2 = résultat



important.jpg

- Le futur c'est maintenant ! -

Aujourd’hui, sur les nouvelles plateformes, on tente de produire des passes d’information et de les “compositer” en 2d, à la Rasterization : GI/AmbOcc, shaders, lighting, etc… C’est le deferred rendering. Prévu pour Unity 3. Existe dans UE3, Cry Engine 3.

En ce moment sur Unity par exemple, on a une architecture de rendu hybride.

Le Deferred Rendering est aussi en soi une méthode d’optim de rendu des pixel shaders et lightings.

De plus, il existe aussi le systeme de Sparse Virtual Texture ou encore le Sparse Voxel Octree, ou il n’y a plus de Normal maps, de diffuse, de lod, etc… toutes ces infos sont stockées dans un objet dynamique. De plus la quantité de géométrie devient quasiement infinie puisque streamée. Ces techno sont integrées dans CryEngine 3, IdTech 5… Ne fonctionne qu’avec les objets statiques. C’est une alternative à la tesselation à haut niveau.

Sparse Virtual Texture :


Sparse Voxel Octree :