Taille de sprite optimale pour les rotations

8

Je fais un jeu basé sur un sprite, et j'ai un tas d'images que j'obtiens dans une résolution ridiculement grande et je les redimensionne à la taille de sprite souhaitée (par exemple 64x64 pixels) avant de les convertir en ressource de jeu, donc quand dessinez mon sprite à l'intérieur du jeu, je n'ai pas à le mettre à l'échelle.

Cependant, si je fais pivoter ce petit sprite à l'intérieur du jeu (moteur agnostiquement), certains pixels de destination seront interpolés et le sprite aura l'air taché.

Cela dépend bien sûr de l'angle de rotation ainsi que de l'algorithme d'interpolation, mais peu importe, il n'y a pas suffisamment de données pour échantillonner correctement un pixel de destination spécifique.

Il y a donc deux solutions auxquelles je peux penser. La première consiste à utiliser l'image énorme d'origine, à la faire pivoter selon les angles souhaités, puis à réduire toutes les variations qui en résultent, et à les mettre dans un atlas, qui a l'avantage d'être assez simple à mettre en œuvre, mais consomme naïvement deux fois plus de sprite espace pour chaque rotation (chaque rotation doit être inscrite dans un cercle dont le diamètre est la diagonale du rectangle du sprite d'origine, dont l'aire est le double de ce rectangle d'origine, en supposant des sprites carrés).

Il présente également l'inconvénient de ne disposer que d'un jeu de rotations prédéfini, qui peut être correct ou non selon le jeu.

Donc, l'autre choix serait de stocker une image plus grande, de faire pivoter et de réduire l'échelle pendant le rendu, ce qui m'amène à ma question.

Quelle est la taille optimale pour ce sprite? Optimal signifiant qu'une image plus grande n'aura aucun effet sur l'image résultante.

Cela dépend certainement de la taille de l'image, du nombre de rotations souhaitées sans perte de données jusqu'à 1/256, qui est la différence de couleur minimale représentable.

Je cherche une réponse théorique générale à ce problème, car essayer un tas de tailles peut être correct, mais est loin d'être optimal.

Pyjama Panda
la source
3
Ce n'est pas une réponse utile, mais j'ai relu la question, j'ai dit "Oh, c'est facile!", Je suis allé écrire une réponse, j'ai froncé les sourcils, je l'ai relue, puis j'ai réfléchi très dur pendant quelques minutes avant de conclure que ce n'est pas, en fait, facile. Cela dit, mon instinct est "deux fois la résolution sur chaque axe est parfaite ou certainement assez bonne", mais je n'ai aucune preuve pour cela. Enfin, je soupçonne que cela dépend considérablement du noyau de réduction d'échelle que vous comparez - un simple noyau de moyenne de pixels peut être facile à analyser et à reproduire, mais un noyau Lanczos peut s'avérer impossible.
ZorbaTHut
Je pense que votre supposition que 1/256 est la limite du delta de différence de couleur acceptable est fausse car l'espace chromatique traditionnel (sRGB) est non linéaire.
sam hocevar
@sam Il peut ne pas être linéaire lorsqu'il est calculé sur le spectre lumineux réel, mais la quantification est linéaire. Cependant, cela dépend vraiment de l'algorithme d'interpolation, et les résultats peuvent être très différents pour une interpolation linéaire et, par exemple, bicubique. Mais même sans interpolation, il devrait y avoir un moyen de calculer la taille optimale.
Panda Pyjama
@zorbathut La réponse est définitivement différente selon l'algorithme de sous-échantillonnage. Mais il devrait être relativement simple de trouver une solution générale pour le plus proche voisin ou l'interpolation linéaire. J'y travaille encore, mais je pense que pour 8 directions, sqrt (2) la zone est optimale. Faites-moi savoir où vous en êtes
Panda Pyjama

Réponses:

7

Je pense que ce que vous essayez de faire est l'espace d'image 2D équivalent à un double arrondi . Je peux construire une preuve lâche qu'il est impossible de trouver une telle taille intermédiaire, au moins dans le cas d'algorithmes de réduction d'échelle simples tels que l'interpolation linéaire.

Supposons que nous ayons trouvé Nune image de taille intermédiaire N×Nsupérieure à 64×64. Supposons que nous n'appliquions même pas encore la rotation (l'angle est nul).

Construisons maintenant une image qui ne fonctionne pas.

Construire l'image intermédiaire

Considérons une image intermédiaire entièrement noire. De toute évidence, l'image finale sera également entièrement noire. Ensuite, ajoutez un pixel gris d'intensité minimale (R¸G, B = 1,1,1). L'image finale doit toujours être entièrement noire. Ajoutez un autre pixel gris touchant le premier. Continuez à construire un cercle jusqu'à ce que l'image finale ne soit plus entièrement noire.

construire l'image intermédiaire Image 1

Maintenant, un pixel de l'image finale est gris (si nous continuions indéfiniment, l'image résultante serait entièrement grise, donc à un moment donné, un pixel devient gris), et si nous supprimons ce dernier pixel, il redevient entièrement noir.

Construire l'image originale

Considérez l'image originale hypothétique qui a conduit à notre image intermédiaire. Je ne peux pas prouver qu'il existe, mais j'ai un fort sentiment que c'est le cas. Par exemple, si l'image d'origine a une taille 2N×2N, ce pourrait être celle-ci:

image originale Image 2

Lorsque vous réduisez l'image 2 à la taille intermédiaire, nous obtenons l'image 1.

Et par hypothèse, lors de la mise à l'échelle vers 64×64, nous obtenons un point gris dans l'image finale.

Maintenant, séparons le dernier pixel que nous avons ajouté et dispersons-le autour du cluster d'origine:

image non fonctionnelleImage 3

Ceci est notre contre-exemple.

Lorsqu'elle est réduite à la taille finale, cette image devrait nous donner un pixel gris, car les pixels que nous avons dispersés sont encore plus proches de l'amas, donc l'intensité globale est au moins aussi élevée.

Lorsqu'elle est réduite à la taille intermédiaire, cette image doit manquer le pixel spécial car ils ont été dispersés, donc nous obtenons une image entièrement noire lors du redimensionnement en deux étapes.

Conclusion et réflexions futures

J'espère que cela vous convaincra que ce que vous essayez de réaliser ne fonctionnera pas dans le cas général.

Mon approche de votre problème serait de calculer la meilleure taille par image : commencez par l'image d'origine et par exemple. N = 128, puis essayez tous les angles possibles et calculez l'erreur maximale. Si l'erreur maximale n'est pas satisfaisante, essayez N = 256 etc. jusqu'à ce que vous obteniez la bonne taille.

sam hocevar
la source
Voir ce problème comme un double arrondi est une approche assez intéressante, mais je ne suis pas d'accord avec votre hypothèse selon laquelle c'est impossible, car vous regardez cela numériquement, pas comme un problème de signal. Prenons un signal unidimensionnel. En l'échantillonnant en n points, nous conserverons toutes les informations avec des fréquences allant jusqu'à 1 / 2n . En utilisant le théorème de Nyquist, il est possible d'échantillonner le signal en m> n points, puis de le rééchantillonner en n points, et d'arriver au même résultat que si nous l'avions initialement échantillonné en n points. Cela peut être facilement étendu à n dimensions.
Panda Pyjama
1
@PandaPajama malheureusement en invoquant Nyquist, vous supposez que le signal peut être strictement limité à la bande, ce qui n'est pas le cas lorsque nos échantillons sont sur un domaine discret. C'est ce que mon contre-exemple exploite et pourquoi il est lié à l'arrondi.
sam hocevar
Si l'image d'origine est arbitrairement grande, elle peut être considérée comme si elle se trouvait sur un domaine continu. Cependant, sur une discussion plus pratique, votre argument est valable lorsque vous envisagez un algorithme très spécifique pour la réduction d'échelle avec une taille très spécifique (2x). Les interpolations le plus proche voisin, bilinéaire et bicubique donneront des résultats différents. Spécifiquement pour le plus proche voisin, je pense qu'il est possible de construire géométriquement une solution générale, mais cela devra attendre le week-end.
Panda Pyjama
1
@PandaPajama vous avez à nouveau raison, les très grandes images peuvent être considérées comme continues, mais le problème est que l'image intermédiaire est toujours sur un domaine discret. De plus, le plus proche voisin ne souffrira pas du problème d'arrondi par définition, mais en dehors des cas triviaux, il souffrira de 1) problèmes liés au théorème d'équidistribution qui rendront la taille minimale proche de 6400 × 6400, c'est-à - dire. assez peu pratique, et 2) de graves problèmes d'alias.
sam hocevar