Comment le mip-mapping fonctionne-t-il avec des textures sans puissance de 2?
12
J'ai entendu dire que les GPU récents prennent tous en charge des textures non puissantes et que toutes les fonctionnalités fonctionnent. Cependant, je ne comprends pas comment le mip-mapping fonctionnerait dans un tel scénario. Quelqu'un peut-il expliquer?
La règle est que pour calculer la taille de mipmap suivante, vous divisez par deux et arrondissez à l'entier le plus proche (à moins qu'il ne soit arrondi à 0, auquel cas, c'est 1 à la place). Par exemple, une image 57x43 aurait des mipmaps comme:
Le mappage UV, la sélection LOD et le filtrage fonctionnent de la même manière que pour les tailles de texture à deux.
Générer des mips de bonne qualité pour une texture sans puissance de deux est un peu plus délicat, car vous ne pouvez pas simplement faire la moyenne d'une boîte 2x2 de pixels pour sous-échantillonner dans tous les cas. Cependant, un filtre de boîte 2x2 n'était pas génial au début, donc l'utilisation d'un meilleur filtre de sous-échantillonnage tel que Mitchell-Netravali est recommandée quelle que soit la taille de la texture.
Y a-t-il un désaccord entre cette réponse et la réponse de John Calsbeek? L'implémentation correspond-elle aux deux descriptions? Sinon, il serait utile d'avoir une référence pour l'un ou l'autre (ou les deux s'il s'agit de deux techniques différentes utilisées).
trichoplax du
4
Une façon de penser est que les cartes graphiques implémentent souvent des textures non-power-of-2 simplement en les remplissant jusqu'à ce qu'elles soient une puissance de 2 dans chaque direction. Cela fait que la plupart des choses "fonctionnent": la mosaïque et le filtrage matériel, par exemple. La seule chose qui doit changer est la conversion des coordonnées de texture en coordonnées d'image.
S'il est implémenté comme ça, il est évident de faire du mipmapping: rien ne change. Même si vous avez un GPU qui prend en charge les textures sans puissance de 2 sans remplissage, les niveaux de mipmap se retrouveraient avec du "remplissage". par exemple une texture 3x3 aurait une texture 2x2 comme lod 1.
Y a-t-il un désaccord entre cette réponse et la réponse de Nathan Reed? L'implémentation correspond-elle aux deux descriptions? Sinon, il serait utile d'avoir une référence pour l'un ou l'autre (ou les deux s'il s'agit de deux techniques différentes utilisées).
trichoplax
1
@trichoplax Je pense que l'affirmation de Nathan selon laquelle "générer des mips de bonne qualité pour une texture sans puissance de deux est un peu plus délicat" rend nos réponses en désaccord au moins légèrement. Cela mérite à lui seul plus d’élaboration.
John Calsbeek, le
1
Je pense que le problème ici est que nous confondons la position logique des texels avec leur disposition "physique" en mémoire. 1) Les pixels sont des éléments discrets, c'est-à-dire que vous avez toujours besoin d'une dimension entière, et donc réduire l'échelle d'une dimension impaire signifie que nous devons arrondir ou arrondir. Puisque nous devons arrondir une fois que nous arrivons à une texture Nx1 ou 1xN, il est logique de toujours arrondir. 2) Lorsqu'il est disposé dans des adresses physiques, il n'est pas rare de garnir la texture à une taille de "foulée" "pratique". Cela peut être fait pour 2 raisons: a) Cela peut rendre le matériel moins cher & b) si une commande de P.of.2, Morton est facile.
Une façon de penser est que les cartes graphiques implémentent souvent des textures non-power-of-2 simplement en les remplissant jusqu'à ce qu'elles soient une puissance de 2 dans chaque direction. Cela fait que la plupart des choses "fonctionnent": la mosaïque et le filtrage matériel, par exemple. La seule chose qui doit changer est la conversion des coordonnées de texture en coordonnées d'image.
S'il est implémenté comme ça, il est évident de faire du mipmapping: rien ne change. Même si vous avez un GPU qui prend en charge les textures sans puissance de 2 sans remplissage, les niveaux de mipmap se retrouveraient avec du "remplissage". par exemple une texture 3x3 aurait une texture 2x2 comme lod 1.
la source