c# - texture - Obteniendo el efecto de "risita" cuando se mueve lentamente un objeto
unity ui image change sprite (2)
Preparé una animación rápida para demostrar lo que está sucediendo aquí:
La cuadrícula representa los píxeles de salida de su pantalla. He superpuesto encima del sprite deslizante que queremos muestrear, si pudiéramos renderizarlo con una resolución ilimitada de subpíxeles.
Los puntos en el centro de cada celda de cuadrícula representan su punto de muestreo. Debido a que estamos usando el filtro Nearest-Nieghbour / Point, ese es el único punto en la textura al que prestan atención. Cuando el borde de un nuevo color cruza ese punto de muestreo, el píxel entero cambia de color a la vez.
El problema surge cuando la cuadrícula texel fuente no se alinea con nuestros píxeles de salida . En el ejemplo anterior, el sprite es de 16x16 texels, pero lo he escalado para ocupar 17x17 píxeles en la pantalla. Eso significa que, en algún lugar de cada cuadro, algunos texels deben repetirse. Donde esto sucede cambia a medida que movemos el sprite.
Debido a que cada texel se representa ligeramente más grande que un píxel, hay un momento en que completa puentes entre los puntos de muestreo de dos píxeles adyacentes. Ambos puntos de muestreo aterrizan dentro del mismo texel ampliado, por lo que ambos píxeles ven ese téxel como el más cercano al que se va a muestrear, y el téxel sale a la pantalla en dos lugares.
En este caso, dado que solo hay una diferencia de escala 1/16, cada téxel solo se encuentra en esta situación extraña para un cuadro o dos, luego se desplaza a su vecino, creando una ondulación de píxeles duplicados que parece deslizarse por la imagen.
( Se podría ver esto como un tipo de patrón muaré resultante de la interacción de la red de téxel y la cuadrícula de muestreo cuando no son similares)
La solución es garantizar que escale su arte de píxeles para que cada texel se muestre al tamaño de un número entero de píxeles .
Ya sea 1: 1
O 2: 1, 3: 1 ...
El uso de un múltiplo más alto permite que el sprite se mueva en incrementos más cortos que su propio tamaño de téxel, sin un estiramiento localizado que afecte la apariencia deseada de la técnica.
Por lo tanto, preste mucha atención a la resolución de su salida y al escalado aplicado a sus activos, para asegurarse de mantener una relación múltiple entre ellos. La publicación de blog que enlaces CAD97 tiene pasos prácticos que puede tomar para lograr esto.
Editar: Para demostrar esto en el proyecto de Unity que cargó, modifiqué la configuración de la cámara para que coincida con la configuración de píxeles a unidades, y expuse la siguiente prueba. El Mario en la parte superior tiene una proporción ligeramente no entera de texel a pixel (1.01: 1), mientras que Mario en la parte inferior tiene 1: 1. Solo puedes ver los mejores objetos expuestos de Mario:
¿Cómo elimino este efecto de "risita" cuando muevo lentamente un sprite?
He intentado ajustar los valores de Antialiasing en QualitySettings
y Filter Mode en ImportSettings
en el Editor de Unity, pero eso no cambia nada.
Idealmente, me gustaría mantener el Modo de filtro a Point (no filter)
y anti aliasing activado a 2x
El sprite se encuentra dentro de un componente de Sprite Renderer de un GameObject.
He subido mi Unity Project aquí: http://www.filedropper.com/sprite
Realmente no sé cómo solucionar el problema ... ¿Alguien puede ayudar con mi proyecto personal?
Puede que le interese esta publicación de blog sobre cómo hacer juegos 2D "perfectos para píxeles" en Unity.
Algunos extractos relevantes:
¡Si comienzas tu juego de píxeles con todas las configuraciones predeterminadas en Unity, se verá terrible!
El secreto para hacer que tu juego pixelado se vea bien es asegurarte de que tu sprite se represente en un bonito límite de píxeles. En otras palabras, asegúrese de que cada píxel de su sprite se represente en un píxel de pantalla.
Estas otras configuraciones son esenciales para que todo sea lo más nítido posible.
En el sprite:
- Asegúrate de que tus sprites estén usando compresión sin pérdida, por ejemplo True Color
- Desactivar mipmapping
- Utilice el muestreo de puntos
En la configuración de calidad de procesamiento:
- Desactivar el filtrado anisotrópico
- Desactivar aliasing
Active la alineación de píxeles en el sombreador de sprites creando un material personalizado que use el sombreador de Sprite / Default y lo adjunte al SpriteRenderer.
Además, me gustaría señalar que a menos que esté aplicando Física, nunca use FixedUpdate . Además, si tu sprite tiene un Colisionador y se está moviendo, debe tener un Cuerpo rígido cinemático acoplado incluso si nunca vas a usar física, para decirle al motor que el Colisionador se moverá.