La siguiente imagen muestra dos sprites renderizados con muestreo de puntos en la parte superior de un fondo:
- El cráneo izquierdo no tiene rotación / escala aplicada, por lo que cada píxel coincide perfectamente con el fondo.
- El cráneo derecho se gira / escala, y esto da como resultado píxeles más grandes que ya no están alineados en el eje .
¿Cómo podría desarrollar un sombreador de píxeles que representara el sprite transformado a la derecha con píxeles alineados a los ejes del mismo tamaño que el resto de la escena?
Esto podría estar relacionado con la forma en que se implementó el escalado de sprites en juegos antiguos como Monkey Island, porque ese es el efecto que estoy tratando de lograr, pero con la rotación agregada.
Editar
Según las sugerencias de kaoD, traté de abordar el problema como un proceso posterior. El enfoque más sencillo era primero renderizar a un objetivo de renderizado separado (muestreado de forma descendente para que coincida con el tamaño de píxel deseado) y luego aumentar la escala cuando se renderiza por segunda vez. Abordó mis requisitos anteriores.
Primero intenté hacerlo Linear -> Point
y el resultado fue este:
No hay distorsión, pero el resultado se ve borroso y pierde la mayoría de los colores resaltados. En mi opinión, rompe el aspecto retro que necesitaba.
La segunda vez que lo intenté Point -> Point
y el resultado fue este:
A pesar de la distorsión, creo que podría ser lo suficientemente bueno para mis necesidades, aunque se ve mejor como una imagen fija que en movimiento.
Para demostrarlo, aquí hay un video del efecto, aunque YouTube filtró los píxeles:
Sin embargo, dejaré la pregunta abierta durante unos días más en caso de que a alguien se le ocurra una mejor solución de muestreo que mantenga la apariencia nítida mientras disminuye la cantidad de distorsión al moverse.
fuente
SpriteBatch
requiere que use el modo Inmediato, por lo que no vale la pena. Iré con esto :)Respuestas:
Debes aplicar tu sombreador DESPUÉS de que tu sprite haya sido girado.
Si toda la escena aún no ha sido sombreada y tus sprites están realmente pixelados, lo que necesitas es algún tipo de filtro post-FX para toda tu escena. El promedio de regiones de píxeles funcionará bien. No es exactamente lo que pretendes (se verá un poco aturdido al mover / rotar), pero podría ser el truco.
La única forma de mantener ese aspecto retro fiel a lo que quieres es dibujar tus rotaciones de sprites tú mismo. No tiene nada que ver con la forma en que se implementó el escalado: la resolución fue realmente pobre, y hablando de eso, ¿intentó con resoluciones extremadamente bajas? También podría hacer el truco y se verá más natural ya que, bueno, en realidad es lo que causó el efecto que estás buscando. ¡Y es barato! ¡Muy barato! De hecho, será más barato de lo que ya tiene (menos ejecuciones de sombreadores de fragmentos).
El efecto se arruina en su imagen de muestra porque su resolución es alta en comparación con sus sprites, por lo que le permite ver los píxeles reales de la escena.
fuente
SpriteBatch
con el muestreo de puntos activado. Pero un post-fx realmente podría funcionar. Para empezar, intentaré renderizar con muestreo lineal en un objetivo de renderizado, y luego renderizaré todo el objetivo de renderizado en el backbuffer con muestreo de puntos.