« Arquitectura del Virtual Boy (index)

Arquitectura del Virtual Boy

Chapter 5: Gráficos


Tabla de contenidos

  1. Arquitectura
  2. Organizando el contenido
  3. Construyendo un frame
    1. Tiles
    2. Fondos
    3. Sprites
    4. Window
    5. Resultado
  4. Contenido creativo

Repasemos los requisitos clave para mostrar los gráficos correctamente:

La buena noticia es que todo esto está acelerado por el Video Image Processor o 'VIP', un chip dedicado desarrollado por Nintendo. El VIP toma prestadas algunas características del antiguo PPU, aunque lo considero una clara ruptura con sus predecesores.

Arquitectura

A primera vista, el VIP puede parecer otro motor de tiles más, pero es mucho más avanzado. Para empezar, no solo procesa datos gráficos, sino que también controla el escáner.

Image
El chip VIP.

Además, mientras que los motores de tiles clásicos renderizaban los gráficos por línea de escaneo, el VIP emplea una arquitectura de frame buffer, almacenando el frame final en memoria (como bitmap) y enviándolo posteriormente para su visualización. Esto se acerca más al modus operandi de los renderizadores 3D modernos. De hecho, el Virtual Boy fue un paso más allá al implementar una forma de page flipping, en la que se asignan dos frame buffers por unidad de visualización, lo que permite al escáner leer de uno mientras el VIP escribe en el otro. Todo esto ayuda a evitar el desgarro de imagen.

Image
Arquitectura del VIP.

Dicho esto, el VIP puede dividirse en tres áreas principales:

En general, el pipeline es sencillo:

  1. La CPU configura el VIP escribiendo en sus registros internos y llenando la VRAM y la DRAM con los materiales necesarios.
  2. El XP genera entonces los frame buffers, que se almacenan en VRAM.
  3. El DP selecciona el frame buffer adecuado y lo transmite al escáner para su visualización. Para ello, copia el frame, cuatro columnas a la vez, en una pequeña zona de buffer en VRAM conocida como Serial Access Memory o 'SAM', que se emite automáticamente al escáner.

Organizando el contenido

Image
Distribución de memoria del VIP

Desde la perspectiva del desarrollador, hay dos bloques de memoria utilizados por el XP y el DP:

Conviene tener en cuenta que esos 128 KB de VRAM son DRAM de doble puerto 'real' , no simplemente un bloque de RAM reservado para gráficos (que Nintendo también llama 'VRAM'). La DRAM de doble puerto permite que dos dispositivos lean de ella al mismo tiempo, lo que explica por qué el XP puede escribir en la VRAM mientras el escáner lee de ella de forma simultánea.

Image
El chip VRAM.

Además, Nintendo instaló un chip VRAM particular que no se encuentra en ningún catálogo convencional. Hay documentación limitada al respecto, pero según los detalles de la solicitud de patente , el Serial Access Memory (SAM) podría almacenarse en una zona separada dentro de este chip. La SAM está compuesta presumiblemente de SRAM y contiene circuitos adicionales que permiten al escáner leer 16 bits simultáneamente .

Construyendo un frame

Adentrémonos ahora en cómo se dibuja un único frame en el Pixel Processor. Para ilustrarlo, me serviré de los recursos de Virtual Boy Wario Land.

Antes de empezar, te recomiendo encarecidamente leer sobre un motor de tiles anterior, ya que reforzará los conceptos previos.

Tiles

Image
La tabla de patrones con múltiples tiles agrupados.

Image
Un tile individual.

Tiles encontrados en VRAM.

Como ya hemos visto, los motores de tiles tradicionales construyen sus capas mediante bitmaps de 8×8. En el caso del Virtual Boy, los tiles (originalmente llamados 'Characters') se almacenan en VRAM dentro de una zona conocida como Pattern table. Cada tile ocupa 16 bytes (ya que se asignan 2 bits por píxel), por lo que hay espacio suficiente para 2048 tiles.

En cuanto a los colores, los desarrolladores pueden componer ocho paletas de colores: cuatro para los gráficos de fondo y otras cuatro para los sprites.

Puede que te preguntes para qué sirven las paletas de colores si los LEDs son monocromos. Bien, esta configuración permite a los desarrolladores usar diferentes tonos de rojo. Estos tonos se obtienen alterando el brillo de los LEDs.

Los ajustes de brillo se almacenan en dos registros, a los que luego hacen referencia las paletas, creando de facto un catálogo de diferentes tonos. Todas las paletas resultantes contienen:

Fondos

Image
Capa de fondo 0 (BG0).

Image
Capa de fondo 1 (BG1). Esta permanece mayormente oculta durante el juego, y se vuelve completamente visible cuando se pausa.

Image
Capa de fondo 2 (BG2).

Algunas capas de fondo declaradas.

La capa de fondo es muy sencilla: se seleccionan tiles para formar un mapa de 512×512 (64×64 tiles, lo que supone un total de 4096 tiles). Pero eso no es todo, porque en lugar de disponer de una única capa de fondo... ¡hay 14!

Cada capa de fondo individual recibe el nombre de segmento. Un segmento ocupa 8 KB de memoria, y cada referencia de tile almacena atributos de inversión horizontal/vertical y un índice de paleta. Cada referencia de tile consume 2 bytes de memoria.

El Pixel Processor también permite combinar varios segmentos para generar una capa mayor, aunque solo están disponibles ciertas combinaciones. La mezcla más grande combina ocho segmentos.

Sprites

Los sprites (u 'Objects', como los llama Nintendo) son tiles individuales con coordenadas independientes, pero requieren más memoria.

Hay una zona en DRAM llamada Object Attribute Memory (OAM) con 8 KB de memoria asignada, donde se almacenan las definiciones de sprites. Cada definición ocupa 8 bytes, lo que permite declarar hasta 1024 sprites.

Cada sprite incluye las siguientes propiedades:

Notarás que en esta sección no hay capturas de pantalla de ejemplo; los siguientes párrafos explican por qué.

Window

Image
World 1.

Image
World 2. Este se renderiza en ambas pantallas.

Image
World 3. Este se amplía cuando se pausa el juego.

Image
World 4. Esta es la 'capa de sprites' que te debía de antes.

Ejemplos de windows. Algunos se renderizan en ambas pantallas (con efectos de paralaje), mientras que otros son exclusivos de una.

El sistema de capas puede parecer sencillo a primera vista. Al fin y al cabo, el VIP proporciona capas de fondo y una capa de sprites. ¿Qué más se necesitaría?

En la práctica, para mostrar cualquiera de las capas anteriores, deben colocarse en un contenedor llamado Window (también denominado 'World'). Una window es el plano real que se renderiza en la pantalla, y se rellena con las capas construidas previamente. Hay 32 windows disponibles que se superponen para formar el frame final, y cada definición de window ocupa 32 bytes.

Las windows ofrecen varios modos de renderizado. Los desarrolladores pueden seleccionar una capa de fondo o de sprites y mostrarla tal como está. Para ello, la window debe configurarse en Normal mode u Object mode, según el tipo de capa.

Sin embargo, el chip ofrece modos adicionales que aplican efectos extra a las capas de fondo:

Resultado

Image
¡Tachán!

Tras configurarlo todo, el Pixel Processor comienza a renderizar las 32 windows. Al terminar, el frame final se vuelca en la zona del frame buffer. Este proceso se repite también para la otra unidad de visualización.

Dado que el sistema emplea un diseño de doble buffer, el Display Processor siempre lee el frame buffer que el Pixel Processor no está manipulando en ese momento, evitando así el desgarro de imagen. Durante el siguiente período activo, el Pixel Processor sobrescribe el frame que mostraba antes el Display Processor, y el ciclo continúa.

Si hay poco contenido que renderizar (es decir, se usan pocas windows), habrá largos intervalos entre la escritura en el frame buffer y su recuperación por parte del Display Processor. Esto permite a la CPU realizar cambios adicionales en el frame si es necesario. El VIP también está preparado para esto: la CPU puede configurar interrupciones para monitorizar diversos estados del VIP, incluido este escenario.

Por otro lado, si se renderizan demasiadas windows en Affine Mode, el Pixel Processor puede no cumplir el plazo, lo que provoca caídas de frame. Por fortuna, también hay interrupciones disponibles para detectar esta condición. En cualquier caso, la documentación oficial proporcionaba los tiempos para cada tipo de capa.

Contenido creativo

Como puedes ver, hay mucha más tecnología en esta consola de lo que parece a simple vista.

Image
Mapa de fondo inicial.

Image
Mapa renderizado, con proyección en perspectiva aplicada.

Image
Frame que ve el usuario.

Disección del Affine Mode, con Mario's Tennis (1995) como ejemplo.

En un principio, creía que la Game Boy Advance era la primera consola portátil capaz de reproducir el aclamado efecto Mode 7 de la Super Nintendo, casi 11 años después. Resulta que fue el Virtual Boy quien lo logró primero, solo cinco años después. Y podía ir más lejos todavía: como hemos visto, las transformaciones afines en el Virtual Boy podían aplicarse a las 32 capas (aunque con ciertas limitaciones).

Además, todas estas nuevas funciones operaban en combinación con los efectos de paralaje, algo de lo que también se encargaba el VIP.

No puedes evitar preguntarte qué tipo de juegos habrían surgido si esta consola hubiera durado un poco más, el tiempo suficiente para que los desarrolladores se familiarizaran con este hardware.

Otra característica digna de mención era la capacidad de la CPU para modificar el frame buffer directamente, lo que ofrecía a los desarrolladores la flexibilidad de construir su propio renderizador cuando el VIP no era suficiente. Así es como algunos juegos lograron mostrar sus innovadores gráficos. Por ejemplo, Red Alarm implementó un escenario compuesto de wireframes 3D renderizados por la CPU.

Image
Red Alarm (1995).

Image
Waterworld (1995).

Ambos juegos apenas utilizan el VIP para dibujar, dejando a la CPU encargarse de los gráficos principales.

Por desgracia, desafíos fundamentales como la determinación de superficie visible no siempre se resolvieron correctamente. Sospecho que esto se debió a las limitaciones de la CPU. En cualquier caso, esto derivó en escenas que se convertían en una maraña de mallas, lo que dificultaba al jugador distinguir qué objetos estaban detrás de otros.


Previous: 4. CPU

Next: 6. Audio


Rodrigo Copetti © 2026 RSS Feed

Ir a la edición moderna

Inicio · Escritos · Soporte · Acerca del autor · Acerca del sitio web