Filtrage de textures avec Mipmaps (Direct3D 9)

Un mipmap est une séquence de textures, chacune d’elles étant une représentation à résolution progressivement inférieure de la même image. La hauteur et la largeur de chaque image, ou niveau, dans le mipmap sont une puissance de deux plus petite que le niveau précédent. Les mipmaps n’ont pas besoin d’être carrés.

Une image mipmap haute résolution est utilisée pour les objets proches de l’utilisateur. Les images de résolution inférieure sont utilisées lorsque l’objet apparaît plus loin. Mipmapping améliore la qualité des textures rendues au détriment de l’utilisation de plus de mémoire.

Direct3D représente les mipmaps sous la forme d’une chaîne de surfaces attachées. La texture de résolution la plus élevée se trouve en tête de la chaîne et a le niveau suivant du mipmap en tant que pièce jointe. À son tour, ce niveau a une pièce jointe qui est le niveau suivant dans le mipmap, et ainsi de suite, jusqu’au niveau de résolution le plus bas du mipmap.

Les illustrations suivantes montrent un exemple de ces niveaux. Les textures bitmap représentent un signe sur un conteneur dans un jeu 3D à la première personne. Lorsqu’il est créé en tant que mipmap, la texture de résolution la plus élevée est la première de l’ensemble. Chaque texture suivante dans le jeu mipmap est plus petite en hauteur et en largeur d’une puissance de 2. Dans ce cas, le mipmap de résolution maximale est de 256 pixels par 256 pixels. La texture suivante est 128 x 128. La dernière texture de la chaîne est 64x64.

Ce signe a une distance maximale à partir de laquelle il est visible. Si l’utilisateur commence loin du signe, le jeu affiche la plus petite texture dans la chaîne mipmap, qui dans ce cas la texture 64x64.

illustration d’une texture 64x64 d’un signe de danger

À mesure que l’utilisateur rapproche le point de vue du signe, des textures de résolution progressivement plus élevées dans la chaîne mipmap sont utilisées. La résolution dans l’illustration suivante est 128 x 128.

illustration d’une texture 128x128 d’un signe de danger

La texture de résolution la plus élevée est utilisée lorsque le point de vue de l’utilisateur est à la distance minimale autorisée du signe, comme illustré dans l’illustration suivante.

illustration d’une texture 256x256 d’un signe de danger

Il s’agit d’un moyen plus efficace de simuler la perspective pour les textures. Au lieu d’afficher une seule texture à de nombreuses résolutions, il est plus rapide d’utiliser plusieurs textures à différentes résolutions.

Direct3D peut évaluer la texture d’un jeu de mipmaps qui est la résolution la plus proche de la sortie souhaitée, et il peut mapper des pixels dans son espace de texel. Si la résolution de l’image finale se trouve entre les résolutions des textures dans le jeu mipmap, Direct3D peut examiner les texels dans les deux mipmaps et fusionner leurs valeurs de couleur.

Pour utiliser des mipmaps, votre application doit générer un ensemble de mipmaps. Les applications appliquent des mipmaps en sélectionnant le jeu de mipmap comme première texture dans l’ensemble de textures actuelles. Pour plus d’informations, consultez Texture Blending (Direct3D 9).

Ensuite, votre application doit définir la méthode de filtrage utilisée par Direct3D pour échantillonner des texels. La méthode la plus rapide de filtrage mipmap consiste à faire en sorte que Direct3D sélectionne le texel le plus proche. Utilisez la valeur énumérée D3DTEXF_POINT pour sélectionner cette valeur. Direct3D peut produire de meilleurs résultats de filtrage si votre application utilise la valeur énumérée D3DTEXF_LINEAR. Cette opération sélectionne le mipmap le plus proche, puis calcule une moyenne pondérée des texels entourant l’emplacement dans la texture à laquelle le pixel actuel est mappé.

Les textures Mipmap sont utilisées dans les scènes 3D pour réduire le temps nécessaire au rendu d’une scène. Ils améliorent également le réalisme de la scène. Toutefois, ils nécessitent souvent de grandes quantités de mémoire.

Création d’un ensemble de Mipmaps

L’exemple suivant montre comment votre application peut appeler la méthode IDirect3DDevice9::CreateTexture pour générer une chaîne de cinq niveaux mipmap : 256x256, 128x128, 64x64, 32x32 et 16x16.

// This code example assumes that m_d3dDevice is a
// valid pointer to a IDirect3DDevice9 interface

IDirect3DTexture9 * pMipMap;
m_pD3DDevice->CreateTexture(256, 256, 5, 0, D3DFMT_R8G8B8, 
    D3DPOOL_MANAGED, &pMipMap);

Les deux premiers paramètres acceptés par IDirect3DDevice9::CreateTexture sont la taille et la largeur de la texture de niveau supérieur. Le troisième paramètre spécifie le nombre de niveaux dans la texture. Si vous définissez cette valeur sur zéro, Direct3D crée une chaîne de surfaces, chacune d’une puissance de deux plus petites que la précédente, jusqu’à la plus petite taille possible de 1x1. Le quatrième paramètre spécifie l’utilisation de cette ressource ; dans ce cas, 0 est spécifié pour indiquer l’absence d’utilisation spécifique de la ressource. Le cinquième paramètre spécifie le format de surface pour la texture. Utilisez une valeur du type énuméré D3DFORMAT pour ce paramètre. Le sixième paramètre spécifie un membre du type énuméré D3DPOOL indiquant la classe de mémoire dans laquelle placer la ressource créée. Sauf si vous utilisez des textures dynamiques, D3DPOOL_MANAGED est recommandé. Le paramètre final prend l’adresse d’un pointeur vers une interface IDirect3DTexture9 .

Notes

Chaque surface d’une chaîne mipmap a des dimensions qui représentent la moitié de la surface précédente de la chaîne. Si le mipmap de niveau supérieur a des dimensions de 256 x 128, les dimensions du mipmap de deuxième niveau sont de 128 x 64, le troisième niveau est de 64 x 32, et ainsi de suite, jusqu’à 1x1. Vous ne pouvez pas demander un certain nombre de niveaux de mipmap dans Niveaux qui entraînerait une largeur ou une hauteur inférieure à 1 pour n’importe quel mipmap dans la chaîne. Dans le cas simple d’une surface mipmap de niveau supérieur 4x2, la valeur maximale autorisée pour Levels est trois. Les dimensions de niveau supérieur sont 4x2, les dimensions du deuxième niveau sont 2x1 et les dimensions du troisième niveau sont 1x1. Une valeur supérieure à 3 dans Niveaux entraîne une valeur fractionnaire dans la hauteur du mipmap de deuxième niveau et est donc interdite.

 

Sélection et affichage d’un Mipmap

Appelez la méthode IDirect3DDevice9::SetTexture pour définir le jeu de textures mipmap comme première texture de la liste des textures actuelles. Pour plus d’informations, consultez Texture Blending (Direct3D 9).

Une fois que votre application a sélectionné le jeu de textures mipmap, elle doit affecter des valeurs du type énuméré D3DTEXTUREFILTERTYPE à l’état D3DSAMP_MIPFILTER sampler. Direct3D effectue alors automatiquement le filtrage des textures mipmap. L’activation du filtrage de texture mipmap est illustrée dans l’exemple de code suivant.

m_pD3DDevice->SetTexture(0, pMipMap);
m_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

Votre application peut également parcourir manuellement une chaîne de surfaces mipmap à l’aide de la méthode IDirect3DTexture9::GetSurfaceLevel et en spécifiant le niveau mipmap à récupérer. L’exemple suivant traverse une chaîne mipmap des résolutions les plus élevées aux résolutions les plus basses.

IDirect3DSurface9 * pSurfaceLevel;
for (int iLevel = 0; iLevel < pMipMap->GetLevelCount(); iLevel++)
{
    pMipMap->GetSurfaceLevel(iLevel, &pSurfaceLevel);
    // Process this level
    pSurfaceLevel->Release();
}

Les applications doivent parcourir manuellement une chaîne mipmap pour charger des données bitmap dans chaque surface de la chaîne. Il s’agit généralement de la seule raison de traverser la chaîne. Une application peut récupérer le nombre de niveaux dans un mipmap en appelant IDirect3DBaseTexture9::GetLevelCount.

Filtrage des textures