Gráficos en consolas antiguas (X): Generación de fondos y sprites.

En esta entrada me centrare en el ancestro que es el propio TMS9918A ya que fuera de las especificaciones todos comparten la forma de generar los gráficos, y me centrare de forma especifica en como que dibuja la escena en pantalla. Dado que NES, SNES, SMS, Genesis/Mega Drive, Game Gear, PC-Engine, Game Boy/Game Boy Color. Tienen procesadores gráficos inspirados por el TMS9918A (con diferentes optimizaciones y mejoras).

TMS9918APattern

Tenemos la pantalla no dividida por pixeles sino por celdas “M”, cada celda “M” corresponde a un espacio de 8×8 pixeles en la pantalla, a cada celda le toca una posición de la Name Table la cual va desde la posición 0 (patrón/sprite en la parte superior izquierda), hasta el patrón/sprite 768. Dado que la resolución de la Colecovision/MSX/SG-1000 era de 256×192 pixeles estos se traduce en 32×24 celdas, que son 768 celdas en la Name Table. El contenido de cada una de las posiciones de la Name Table es un apuntador, no contiene los datos del patrón/sprite sino que le dice al TMS9918A donde se encuentra la información del patrón/sprite dentro de la memoria de video así como el color que ha de cargar para dicho patrón/sprite. Todo esto sirve para generar la Sprite Attribute Table.

La Sprite Attribute Table ocupa unos 128 bytes de memoria y contiene los 32 patrones/sprites que hay en su interior que son los que se dibujarán en pantalla con la información almacenada de la siguiente manera:

SAT

La posición vertical y horizontal marcan la posición del pixel superior izquierdo del patrón/sprite en pantalla, dado que el tamaño es de un byte estamos hablando de una pantalla de 256×256 pixeles como mucho, Name apunta a la Sprite Generator Table donde se encuentra la información sobre que pixeles son visibles en la actual linea de escaneo y cuales no. Dado que el TMS9918A solo podía cambiar el valor de color cada 8 ciclos de reloj y estos se escribían cada 8 ciclos de reloj de este entonces el número de colores cada 8 pixeles solo podían ser dos, el asignado o el transparente (fondo), por lo que la sprite generator table solo tenía dos valores en el TMS9918A, 0 y 1, por cada una de las posiciones:

Captura de pantalla 2015-01-10 a las 14.12.20

En el caso de que los accesos a memoria se puedan realizar a mayor velocidad (y por tanto más colores por linea de sprite) y/o exista una paleta de colores mucho más compleja entonces los valores de la Sprite Generador Table pueden ir más allá del 0 y el 1, aunque 0 significará que siempre dibujará el fondo o el plano que tenga más cercano. El Color Code por otro lado carga la paleta de colores correspondiente al patrón/sprite de las almacenadas en memoria.

Al final el dibujado del patrón/sprite sigue los siguientes pasos:

  1. El  procesador gráfico lee de la Name Table para cuales son los patrones/sprites corresponden a la siguiente imagen una vez ha recibido los datos durante el periodo de VSync, a partir de la información de la Name Table genera la Sprite Attribute Table (OAM en el hardware de Nintendo)  y lo almacena en una memoria que puede ser interna o externa dependiendo del sistema.
  2. Cuando llega el momento de generar la linea lo que hace por cada patrón/sprite es leer el tercer byte (name) de la SAT/OAM y saca la linea actual del patrón/sprite.
  3. Lee el Color Code de la SAT/OAM para tener el código de color.
  4. Escribe la linea del patrón/sprite en la VRAM según la información obtenida del patrón y el color.

El otro punto que creo que es importante es el de los fondos, planos de scroll. La configuración del TMS9918A soporta dos planos, un fondo y un el primer plano que es el que sufre cambios. Dicho de otra manera, si un objeto o varios se mueven la CPU solo tiene que cambiar la información de las celdas que contengan los patrones/sprites de la Name Table del primer plano ya que el fondo siempre es estático. Los patrones/sprites tienen un orden de prioridad a la hora de dibujarse en pantalla siendo el primer plano el que siempre tiene prioridad a la hora de dibujarse, si no tiene representante pasa al fondo. Dado que los planos de fondo suelen ser más grandes en tamaño que la propia pantalla entonces a medida que movemos el personaje estos se van desplazando.

En sistemas más avanzados donde hay varios planos de scroll/fondos se aplica una tabla de prioridad a la hora de dibujar los patrones/sprites, el hecho de aplicar varios fondos/scroll da una sensación de tridimensionalidad a los fondos de la escena.

Parallax-scroll-example-2

Existe además una técnica llamada scroll parallax,está consiste en que los diferentes fondos o partes de un fondo se desplacen a diferentes velocidades que el scroll del juego.

Eso es todo, nos vemos en la siguiente. Y si hay alguna duda preguntad, es posible que repase esta entrada ya que a lo mejor me he dejado algo con las prisas.

Anuncios