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.
Réponses:
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é
N
une image de taille intermédiaireN×N
supé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.
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 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 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, essayezN = 256
etc. jusqu'à ce que vous obteniez la bonne taille.la source