La rastérisation, ou matricialisation, est un procédé qui consiste à convertir une image vectorielle en une image matricielle destinée à être affichée sur un écran ou imprimée par un matériel d'impression.
Les scènes en trois dimensions étant généralement stockées en mémoire sous forme vectorielle, ce terme s'applique également pour leur rendu à l'écran (l'écran fournissant une image matricielle), c'est d'ailleurs la principale utilisation du mot rastérisation. Par extension, on englobe aussi dans la rastérisation tous les procédés permettant d'améliorer l'aspect final du rendu 3D.
La rastérisation d'images en deux dimensions étant nécessaire à l'intérieur de son équivalent 3D, la suite de cet article s'intéressera uniquement à la rastérisation d'images en trois dimensions dans le but de détailler les deux méthodes simultanément.
Ce procédé est l'une des deux principales techniques de rendu 3D, avec le (« reconstitution du trajet des rayons »). Comparée au , la rastérisation est beaucoup plus rapide en matière de calcul.
Étymologie vignette|upright|Le terme raster dans .
Rastérisation se calque sur l’anglais . En anglais, le suffixe forme des verbes à partir de noms ou d'adjectifs, le verbe signifiant alors « faire/fabriquer ce qui est dénoté par le nom » http://en.wiktionary.org/wiki/-ize.. Le nom vient de l’allemand , du latin (« râteau, hoyau »), de l’infinitif du verbe (« racler, ratisser, gratter, écorcher ») http://en.wiktionary.org/wiki/raster..
En anglais courant, désigne le motif de lecture affine de lignes parallèles utilisé pour former une image projetée sur le tube cathodique d’un écran. D’où la reprise du terme pour désigner une image matricielle qui est constituée d’une grille de pixels, stockée comme une série de lignes.
Le terme matricialisation, plus rare, découle également du passage à une version matricielle de l’image, par rapport à une image vectorielle. Cependant, ces termes sont eux-mêmes ambigus, des vecteurs pouvant être stockés et manipulés sous forme de matrices. Dans ce vocable, les images matricielles désignent des images décrites point à point, et les images vectorielles tout autre type de description d’une scène nécessitant une transformation vers une image point à point pour affichage.
Principe géométrique de base La conversion d'images vectorielles en trois dimensions vers une image matricielle en deux dimensions se fait en deux étapes : la conversion de l'image vectorielle 3D en image vectorielle 2D, puis la rastérisation (voir récursivité) de celle-ci en une image matricielle 2D finale.
Calcul des coordonnées 2D La première étape est la projection des différents modèles de l'image vers le plan 2D. Ce calcul peut être résumé en trois étapes : l'intégration du modèle dans le monde, (M2W) ; la prise en compte de la position et de l'angle de la caméra, (W2V) ; la prise en compte des dimensions de l'écran, (V2P).
Chacune de ces étapes correspond à une matrice. Le calcul est une simple multiplication des coordonnées de chaque sommet avec les trois matrices. On obtient ainsi pour chaque sommet ses coordonnées 2D ainsi que sa profondeur.
Remarque : dans les API 3D actuelles, Direct3D utilise ces trois matrices alors qu'OpenGL n'utilise pas la matrice monde () : en effet, elle est combinée avec la matrice donnant par conséquent une matrice (GL_MODELVIEW) (remarque valable pour les anciennes versions de l'API OpenGL qui, à partir de la version 4.0, n'implémente plus de système de gestion de matrices, qui doit être pris en charge par le programmeur, dans une optique de flexibilité de la gestion du pipeline graphique).
Transformation La matrice M2W correspond à une succession d’opérations réalisées sur un objet. Ces opérations sont : la rotation ; la translation ; la mise à l'échelle.
En termes physiques on dirait qu’appliquer une matrice M2W à un objet revient à passer du référentiel propre à l’objet (le modèle) au référentiel commun à tous les objets d’une scène graphique (le monde).
{| class="toccolours collapsible collapsed" width="90%" style="text-align:left" !Les matrices de rotation |- |* Matrice de rotation dans le plan : Fichier:Info_3D_repere_oij.PNG Soit
et
matrices de rotation dans l'espace : Dans un repère l'operation ci-dessus équivaut à tourner autour du vecteur c'est-à-dire l'axe de z. autour de l'axe des z : Fichier:Info_3D_repere_oijk.png
autour de l'axe des y : Fichier:Info_3D_repere_okij.png L’angle de vue du repère a changé ainsi que le nom des axes, cependant par rapprochement on peut déduire :
On a alors:
autour de l'axe des x : Fichier:Info_3D_repere_ojki.png
On a alors :
{| class="toccolours collapsible collapsed" width="90%" style="text-align:left" !La matrice de translation
{| class="toccolours collapsible collapsed" width="90%" style="text-align:left" !La matrice de mise à l'échelle
{| class="toccolours collapsible collapsed" width="90%" style="text-align:left" !Synthèse M2W
Matrices de rotation
Matrices de translation
Matrices de mise à l'échelle
Transformation
Cette matrice procède au calcul effectif des coordonnées de chaque point en fonction de la position et de la direction de la caméra.
Voici une matrice de vue classique. Pos et Dir sont les vecteurs indiquant respectivement la position de la caméra et l'endroit pointé. Le vecteur Up indique la direction verticale. Up, puis F, S et U doivent tous être normalisés.
Avec * produit vectoriel
Transformation
La matrice de projection permet d'adapter les coordonnées calculées aux dimensions du framebuffer (c'est-à-dire de la fenêtre ou de l'écran). En effet, une fois les coordonnées multipliées par la matrice de vue, il faut encore prendre en considération la façon dont l'observateur perçoit la scène. Il faut tenir compte de certains paramètres comme les proportions de l'image (4/3, 16/9, ou autre) ou l'angle de vision (120° dans la réalité, généralement 45° à l'écran). C'est à cela que sert cette matrice.
Par exemple, pour un écran de dimensions (width, height) on a : x_ecran = Xa * width / 2 / Za + width / 2 y_ecran = Ya * height / 2 / Za + height / 2
Filtrage des vertices (sommets) Une fois les coordonnées 2D de chaque sommet connues, différentes techniques existent dans le but d'accélérer la suite du rendu.
Le (« élimination des faces cachées ») consiste à calculer la normale de chaque face et à la comparer avec l'orientation de la caméra. Si l'angle entre les deux est supérieur à 90°, la face est dirigée vers l'extérieur et n'a donc pas besoin d'être calculée.
Si les coordonnées 2D à l'écran de tous les sommets d'une face sont à l'extérieur de la ligne formée par un des bords de la fenêtre de vision, il n'est pas non plus nécessaire d'effectuer le reste des opérations pour celle-ci.
Rastérisation des coordonnées 2D vers l'image finale La dernière opération est de transformer chaque face, ligne ou point en pixels à l'écran.
Par exemple, une ligne qui doit aller des coordonnées (2,3) à (5,3) remplira les pixels (2,3), (3,3), (4,3) et (5,3). L'opération est néanmoins nettement plus complexe pour une ligne oblique ou pour l'intérieur d'un triangle.
Pour chaque pixel ainsi calculé, il s'agit de déterminer ses caractéristiques en pondérant les valeurs aux sommets, qui, elles, sont connues.
Pour reprendre l'exemple de la ligne, si le sommet à gauche est rouge et celui à droite est bleu, le premier pixel à gauche sera complètement rouge, le suivant un peu moins rouge et un peu plus bleu, et ainsi de suite jusqu'au dernier pixel qui sera complètement bleu.
L'utilisation d'un (« tampon des données de profondeur ») est une technique permettant de déterminer quel pixel se trouve au-dessus de quel autre. Il est en effet fréquent que deux éléments se chevauchent, et pour savoir quelles parties de quel(s) élément(s) sont visibles il est possible d'enregistrer au fur et à mesure leur profondeur dans un emplacement mémoire..
Ainsi, si un pixel doit écraser un autre pixel déjà existant, on vérifie grâce au que le premier est plus proche de la caméra que le second. Si c'est le cas, le pixel sera écrasé et le mis à jour avec la nouvelle valeur de profondeur.
Ne pas utiliser de signifie que les derniers éléments à être dessinés le seront forcément au-dessus des autres, même s'ils devraient normalement être en dessous.
Un est un tampon mémoire permettant de filtrer les endroits où l'image doit être dessinée. Le mot anglais signifie « pochoir » en français.
Le et le sont très liés, puisqu'il s'agit dans les deux cas de filtrer les pixels ou non. Contrairement au , il est possible de donner l'ordre au processeur graphique de remplir le dans certaines conditions. L'utilisation d'un repose donc généralement sur deux rendus : un premier rendu partiel permettant de remplir le , puis un second rendu définitif où le filtrage est appliqué.
Pour des exemples pratiques, voir au bas de l'article (ombre portées et reflets).
Anticrénelage
vignette|300px|Exemple de l'intérêt de l'anticrénelage : à gauche (sans anticrénelage) on voit un effet d'escalier sur les bords de la lettre. L'anticrénelage ou anti-aliasing permet d'éviter le crénelage des lignes à l'écran. Par exemple si une ligne va des coordonnées (1,3) à (4,4) elle doit remplir entièrement les pixels (1,3) et (4,4), mais seulement partiellement les pixels (2,3), (2,4), (3,3) et (3,4).
Sans anti-crénelage, l'algorithme ne se soucie pas du remplissage partiel, ce qui crée un effet d'escalier. Avec un anti-crénelage, un remplissage partiel est effectué grâce à la moyenne pondérée de la couleur existante à cet endroit et de la nouvelle couleur.
Le FSAA ou (« anti-crénelage de tout le décor ») consiste à calculer une image plus grande que la définition souhaitée (image sur-échantillonnée) puis à réduire sa définition vers celle souhaitée. Chaque pixel de l'image résultante est une moyenne des pixels de l'image sur-échantillonnée, adoucissant ainsi naturellement les arêtes obliques. Cette technique offre une bonne qualité et est relativement simple à mettre en œuvre, cependant elle a une influence importante sur les performances. De nombreuses autres techniques et optimisations ont été développées pour pallier ce problème de performances (MSAA, FXAA, MLAA, SMAA, TXAA, etc.).
Résultat final Le résultat final est une image matricielle stockée dans un frame buffer (« tampon pour le rendu des images »). Des post-traitements peuvent intervenir sur l'ensemble ou des parties de l'image avant d'envoyer le buffer à sa destination finale (i.e., un dispositif de sortie : écran, imprimante…). Par exemple, pour faire « briller » certaines zones (cf. « »), appliquer un filtre de « flou cinétique » (généralement polaire à partir du centre pour émuler un effet de mouvement rapide de l'image dans l'espace ; cf. ), appliquer un masque sur l'ensemble de l'image (ex. : trou de serrure ou viseur d'une arme à feu), ou encore, appliquer des tampons (ex. du ) Certains de ces effets s'appliquent à l'ensemble de l'image (cas du ) quand les autres utilisent parfois des buffers intermédiaires dédiés à leur tâche précise (cas du ).
Application des textures () et éclairage La base de la rastérisation ne permet néanmoins d'afficher que des objets avec des couleurs simples. La volonté de réalisme a poussé à l'invention des textures et des effets d'ombrage.
Application des textures ()
L'application d'une texture se fait en parallèle tout le long du processus de rastérisation. Chaque sommet initial possède, en plus de ses coordonnées 3D, les coordonnées correspondantes pour la texture à appliquer sur l'ensemble du modèle.
La véritable application de la texture ne se fait qu'au moment du calcul de la couleur de chaque pixel final. Les coordonnées de texture de chaque pixel sont calculées en modulant les valeurs des sommets, de la même manière que pour leur couleur émise et leur profondeur.