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