Tamaño de sprite óptimo para rotaciones

8

Estoy haciendo un juego basado en sprites, y tengo un montón de imágenes que obtengo en una resolución ridículamente grande y las escalo al tamaño de sprite deseado (por ejemplo, 64x64 píxeles) antes de convertirlas en un recurso de juego, así que cuando dibuje mi sprite dentro del juego, no tengo que escalarlo.

Sin embargo, si giro este pequeño sprite dentro del juego (motor agnóstico), algunos píxeles de destino se interpolarán y el sprite se verá manchado.

Por supuesto, esto depende del ángulo de rotación, así como del algoritmo de interpolación, pero independientemente, no hay suficientes datos para muestrear correctamente un píxel de destino específico.

Así que hay dos soluciones en las que puedo pensar. El primero es usar la gran imagen original, rotarla a los ángulos deseados, y luego reducir todas las variaciones resultantes, y ponerlas en un atlas, que tiene la ventaja de ser bastante simple de implementar, pero ingenuamente consume el doble de sprite espacio para cada rotación (cada rotación debe estar inscrita en un círculo cuyo diámetro es la diagonal del rectángulo del sprite original, cuya área es el doble de ese rectángulo original, suponiendo sprites cuadrados).

También tiene la desventaja de tener solo un conjunto predefinido de rotaciones disponibles, lo que puede estar bien o no dependiendo del juego.

Entonces, la otra opción sería almacenar una imagen más grande, y rotar y reducir la escala mientras se renderiza, lo que lleva a mi pregunta.

¿Cuál es el tamaño óptimo para este sprite? Significado óptimo de que una imagen más grande no tendrá efecto en la imagen resultante.

Esto definitivamente depende del tamaño de la imagen, la cantidad de rotaciones deseadas sin pérdida de datos hasta 1/256, que es la diferencia de color mínima representable.

Estoy buscando una respuesta teórica general a este problema, porque probar varios tamaños puede estar bien, pero está lejos de ser óptimo.

Pijama Panda
fuente
3
Esta no es una respuesta útil, pero leí la pregunta, dije "¡Oh, eso es fácil!", Fui a escribir una respuesta, fruncí el ceño, la leí de nuevo y luego lo pensé muy duro durante unos minutos antes de concluir que no es, de hecho, fácil. Dicho esto, mi instinto es "dos veces la resolución en cada eje es perfecta o definitivamente lo suficientemente buena", pero no tengo ninguna evidencia de esto. Finalmente, sospecho que esto depende dramáticamente del kernel de reducción de escala con el que se compara: un kernel simple con un promedio de píxeles puede ser fácil de analizar y replicar, pero un kernel de Lanczos puede resultar imposible.
ZorbaTHut
Creo que su suposición de que 1/256 es el límite de la diferencia de color aceptable delta es incorrecta porque el espacio de color tradicional (sRGB) no es lineal.
sam hocevar
@sam Puede que no sea lineal cuando se compara con el espectro de luz real, pero la cuantización es lineal. Sin embargo, realmente depende del algoritmo de interpolación, y los resultados pueden ser muy diferentes para la interpolación lineal y, por ejemplo, bicúbica. Pero incluso sin interpolación, debería haber una manera de calcular el tamaño óptimo.
Panda Pyjama
@zorbathut La respuesta es definitivamente diferente dependiendo del algoritmo de disminución de resolución. Pero debería ser relativamente simple encontrar una solución general para la interpolación más cercana o la interpolación lineal. Todavía estoy trabajando en ello, pero creo que para 8 direcciones, sqrt (2) el área es óptima. Avísame a dónde llegaste
Panda Pyjama

Respuestas:

7

Creo que lo que está tratando de hacer es el espacio de imagen 2D equivalente al doble redondeo . Puedo construir una prueba flexible de que es imposible encontrar un tamaño tan intermedio, al menos en el caso de algoritmos simples de reducción de escala como la interpolación lineal.

Supongamos que encontramos Nque la imagen intermedia tiene un tamaño N×Nmayor que 64×64. Supongamos que ni siquiera estamos aplicando rotación todavía (el ángulo es cero).

Ahora construyamos una imagen que no funciona.

Construyendo la imagen intermedia

Considere una imagen intermedia completamente negra. Obviamente, la imagen final también será completamente negra. Luego, agregue un píxel gris de intensidad mínima (R¸G, B = 1,1,1). La imagen final aún debe ser completamente negra. Agregue otro píxel gris tocando el primero. Continúe construyendo un círculo hasta que la imagen final ya no sea completamente negra.

construcción de imagen intermedia Imagen 1

Ahora, un píxel en la imagen final es gris (si continuamos para siempre, la imagen resultante sería completamente gris, por lo que obviamente en algún momento un píxel se vuelve gris), y si eliminamos ese último píxel, volverá a ser completamente negro.

Construyendo la imagen original

Considere la hipotética imagen original que condujo a nuestra imagen intermedia. No puedo demostrar que existe, pero tengo el fuerte presentimiento de que existe. Por ejemplo, si la imagen original tiene tamaño 2N×2N, esto podría ser:

imagen original Imagen 2

Al reducir la imagen 2 al tamaño intermedio, obtenemos la imagen 1.

Y por hipótesis, al reducir la escala a 64×64, obtenemos un punto gris en la imagen final.

Ahora separemos el último píxel que agregamos y dispersémoslo por el clúster original:

imagen que no funcionaImagen 3

Este es nuestro contraejemplo.

Cuando se reduce al tamaño final, esta imagen debería darnos un píxel gris, porque los píxeles que dispersamos están aún más cerca del clúster, por lo que la intensidad global es al menos tan alta.

Cuando se reduce al tamaño intermedio, esta imagen debe perder el píxel especial porque se han dispersado, por lo que obtenemos una imagen completamente negra al hacer el cambio de tamaño de dos pasos.

Conclusión y pensamientos futuros.

Espero que esto te convenza de que lo que estás tratando de lograr no funcionará en el caso general.

Mi enfoque para su problema sería calcular el mejor tamaño por imagen : comience con la imagen original y, por ejemplo. N = 128, pruebe todos los ángulos posibles y calcule el error máximo. Si el error máximo no es satisfactorio, intente, N = 256 etc., hasta obtener el tamaño correcto.

sam hocevar
fuente
Ver este problema como un doble redondeo es un enfoque bastante interesante, pero me gustaría estar en desacuerdo con su hipótesis de que es imposible, ya que está viendo esto numéricamente, no como un problema de señal. Consideremos una señal unidimensional. Al muestrearlo en n puntos, retendremos toda la información con frecuencias de hasta 1 / 2n . Usando el teorema de Nyquist, es posible muestrear la señal en m> n puntos, y luego volver a muestrearla en n puntos, y llegar al mismo resultado como si originalmente la hubiéramos muestreado en n puntos. Esto se puede extender fácilmente a n-dimensiones.
Panda Pyjama
1
@PandaPajama desafortunadamente al invocar a Nyquist, usted asume que la señal se puede hacer estrictamente limitada en la banda, que no es el caso cuando nuestras muestras están en un dominio discreto. Esto es lo que explota mi contraejemplo y por qué está relacionado con el redondeo.
sam hocevar
Si la imagen original es arbitrariamente grande, puede considerarse como si estuviera en un dominio continuo. Sin embargo, en una discusión más práctica, su argumento es válido cuando se considera un algoritmo muy específico para la reducción de escala con un tamaño muy específico (2x). Las interpolaciones vecinas, bilineales y bicúbicas más cercanas darán resultados diferentes. Específicamente para el vecino más cercano, creo que es posible construir geométricamente una solución general, pero eso tendrá que esperar el fin de semana.
Panda Pyjama
1
@PandaPajama tiene razón nuevamente, las imágenes muy grandes pueden considerarse continuas, pero el problema es que la imagen intermedia todavía está en un dominio discreto. Además, el vecino más cercano no sufrirá el problema de redondeo por definición, pero aparte de los casos triviales, sufrirá 1) problemas relacionados con el teorema de equidistribución que hará que el tamaño mínimo sea cercano a 6400 × 6400, es decir. bastante poco práctico, y 2) problemas graves de alias.
sam hocevar