Filtrage de texture bilinéaire (Direct3D 9)

Les textures sont toujours traitées de manière linéaire de (0.0, 0.0) dans le coin supérieur gauche à (1.0, 1.0) en bas à droite, comme illustré dans l’illustration suivante.

illustration de la texture 4x4 avec des blocs de couleur unie

Les textures sont généralement représentées comme si elles étaient composées de blocs de couleur unie, mais il est en fait plus correct de penser aux textures de la même façon que vous devriez penser à l’affichage raster : chaque texel est défini au centre exact d’une cellule de grille, comme illustré dans l’illustration suivante.

illustration de texture 4x4 avec des texels définis au centre des cellules de la grille

Si vous demandez à l’échantillonneur de texture la couleur de cette texture aux coordonnées UV (0,375, 0,375), vous obtiendrez un rouge unie (255, 0, 0). Cela est parfaitement logique, car le centre exact de la cellule de texel rouge est à UV (0,375, 0,375). Que se passe-t-il si vous demandez à l’échantillonneur la couleur de la texture aux UV (0,25, 0,25) ? Ce n’est pas aussi facile, car le point à UV (0,25, 0,25) se trouve au coin exact de 4 texels.

Le schéma le plus simple consiste simplement à faire en sorte que l’échantillonneur retourne la couleur du texel le plus proche; il s’agit du filtrage de points (voir Échantillonnage au point le plus proche (Direct3D 9)) et est généralement indésirable en raison de résultats granuleux ou bloquants. L’échantillonnage à un point de notre texture aux UV (0,25, 0,25) montre un autre problème subtil avec le filtrage du point le plus proche : il y a quatre texels équidistants à partir du point d’échantillonnage, donc il n’y a pas de texel le plus proche. L’un de ces quatre texels sera choisi comme couleur retournée, mais la sélection dépend de la façon dont la coordonnée est arrondie, ce qui peut introduire des artefacts déchirants (voir l’article Échantillonnage Nearest-Point dans le KIT de développement logiciel (SDK).

Un schéma de filtrage un peu plus précis et plus courant consiste à calculer la moyenne pondérée des 4 texels les plus proches du point d’échantillonnage; il s’agit du filtrage biligneur, et le coût de calcul supplémentaire est généralement négligeable, car cette routine est implémentée dans le matériel graphique moderne. Voici les couleurs que nous obtenons à quelques exemples différents à l’aide du filtrage bilinéaire :

UV: (0.5, 0.5)

Ce point est à la frontière exacte entre les texels rouges, verts, bleus et blancs. La couleur renvoyée par l’échantillonneur est gris :

  0.25 * (255, 0, 0)
  0.25 * (0, 255, 0) 
  0.25 * (0, 0, 255) 
## + 0.25 * (255, 255, 255) 
------------------------
= (128, 128, 128)
UV: (0.5, 0.375)

Ce point se trouve au milieu de la frontière entre les texels rouges et verts. La couleur renvoyée par l’échantillonneur est jaune-gris (notez que les contributions des texels bleus et blancs sont mis à l’échelle sur 0) :

  0.5 * (255, 0, 0)
  0.5 * (0, 255, 0) 
  0.0 * (0, 0, 255) 
## + 0.0 * (255, 255, 255) 
------------------------
= (128, 128, 0)
UV: (0.375, 0.375)

Il s’agit de l’adresse du texel rouge, qui est la couleur retournée (tous les autres texels dans le calcul de filtrage sont pondérés sur 0) :

  1.0 * (255, 0, 0)
  0.0 * (0, 255, 0) 
  0.0 * (0, 0, 255) 
## + 0.0 * (255, 255, 255) 
------------------------
= (255, 0, 0)

Comparez ces calculs à l’illustration suivante, qui montre ce qui se passe si le calcul de filtrage bilinéaire est effectué à chaque adresse de texture sur la texture 4x4.

illustration de texture 4x4 avec filtrage bilinéaire effectué à chaque adresse de texture

Filtrage de textures