Lección 08 – Shadow & Highlight

Aventuras en Megadrive: Highlight and Shadow

Shadow/Highlight (S/H) es una forma que tiene la Megadrive de alterar el brillo, mostrando el doble (Highlight) o la mitad (Shadow).

La Megadrive tiene una paleta completa de 512 colores, donde cada color se representa por tres valores rojo-verde-azul, mundialmente conocido como RGB. Por tanto para alterar el brillo significa alterar esos valores: Highlight el doble, Shadow la mitad.

Es una forma de conseguir nuevos colores sin usar nuevas paletas:

hs

Ejemplo con una paleta (normal) y sus versiones shadow y highlight

Esto no significa que la paleta se multiplique por tres, ya que a veces aparecen colores que ya estaban en la paleta original. Esto sucede porque para un color determinado, al multiplicarlo o dividirlo por 2, los valores RGB puede que ya estuviesen en la paleta completa.

Para poder utilizar Shadow/Highlight hemos de seguir unas reglas determinadas.
Es complicadoPor ese motivo pocos juegos comerciales lo utilizaron.

Requiere planificar cuidadosamente el uso de planos, paletas, colores y prioridades.

 

Reglas

  • Hemos de activar el modo S/H explícitamente:   
    VDP_setHilightShadow(1);
  • Planos: Los tiles con sin prioridad tendrán colores sombreados=shadow.
  • Planos: Los tiles con con prioridad tendrán colores normales.
  • Planos: Si un tile de un plano tiene sin prioridad (shadow) y se ve solapado por otro tile con con prioridad, los colores mostrados de ambos tiles serán colores normales.
  • Planos: Un plano no puede pintarse con highlight, sólo funciona con sprites.
  • Sprites: Se aplican las mismas reglas que en los planos si el sprite usa alguna de las 3 primeras paletas (pal0, pal1, pal2).
  • Sprites: Para un sprite que use la 4a paleta (pal3), se aplican las mismas reglas anteriores excepto para dos colores (el 14 y el 15):
    •  Si el fondo tiene colores normales:
      • Los píxels del sprite pintados con el color 14 aparecerán con color «highlight».
      • Los píxels del sprite pintados con el color 15 aparecerán con «color shadow».
    • Si el fondo tiene colores shadow:
      • Los píxels del sprite pintados con el color 14 aparecerán con color normal.
      • Los píxels del sprite pintados con el color 15 no aparecerán (ver abajo).
  • Sprites: Highlight ilumina los píxels del fondo con el patrón del sprite, no hace más brillantes los colores propios del sprite, no se ve el sprite si no el fondo que hay detrás pero más brillante.
  • Sprites: Shadow oscurece los píxels del fondo con el patrón del sprite, no hace más oscuros los colores propios del sprite. Igual que antes, no se ve el sprite, si no el fondo que hay detrás (a esto me refería antes : fondo shadow + sprite shadow = fondo shadow).

 

Recordar que los colores van del 0 al 15, y las paletas de la paleta 0 a la paleta 3.

 

Shadow puede ser utilizado con cierta libertad, se aplica a toda la paleta. Se puede utilizar tanto con fondos como con sprites. Aplicando Shadow sobre un fondo con prioridad obtenemos una sombra transparente (con al forma del sprite). Aplicando Shadow en un sprite sobre un fondo sin prioridad no tendrá ningún efecto aparente, ya que la sombra obtenida es del mismo tono que el fondo, y por tanto no se ve.

Highlight es particularmente difícil de usar. Sólo podemos utilizarlo mediante sprites. Funciona por píxel. Aplicando Highlight en un sprite sobre un fondo con prioridad obtenemos un patrón brillante (con la forma del sprite).  Aplicando Highlight en un sprite sobre un fondo sin prioridad obtenemos un patrón con colores normales (con la forma del sprite).

 

No te fíes de los emuladores

Shadow & Highlight no se lleva bien con los emuladores. No te fíes y prueba en hardware real porque los resultados pueden no ser los mismos.

 

 

Ejemplo

Bájate el código del programa de mi github y lanza la ROM para seguir este ejemplo.

En primer lugar vamos a ver qué pasa con un sólo fondo y dos sprites.
Para el fondo usaré el plano A (al ser un sólo plano da igual cual usemos).

fondo1

Hay dos sprites:

  • El primero es Sonic, que usa la paleta pal1.
  • El segundo es una barra horizontal con 16 colores, usaré la pal2 y la pal3 para guardarlos.

barra_paleta

  • Los colores van del 0 al 15, de izquierda a derecha.
  • El color 0 lo he rodeado con un cuadrado pintado con el color 1, ya que el color 0 de las paletas=color transparente.
  • El color 14 es el amarillo, el color 15 es blanco (no se verá en esta página web al tener ésta también el fondo blanco). La pal3 la usaremos para ver qué ocurre precisamente con estos colores.

 

Ahora iré probando diferentes configuraciones. Prueba la ROM y ves siguiendo los siguientes pasos. Recuerda que en todo momento puedes mover la barra con el DPAD.

 

PRUEBA 0. Fondo sin prioridad. Sprites sin prioridad.

Comienzo con fondo y sprites sin prioridad. Este es el aspecto inicial al cargar la ROM:

captura45

Nótese el color blanco (el 15 de la paleta). Se aprecia bien en la captura.

PRUEBA 01. Fondo sin prioridad. Sprites sin prioridad.

Activamos S/H, como no hay prioridad todo sale sombreado, fondos y sprites. No hay transparencias ni brillos.

captura46

 

PRUEBA 02 + 03. Fondo sin prioridad. Sprites con y sin prioridad (alternando).
Fondo con colores sombreados. Los sprites alternan la prioridad: cuando la tengan activa aparecerán con colores normales. No hay transparencias ni brillos.

 

PRUEBA 04. Fondo sin prioridad. Barra sin prioridad. Barra con pal3.
Fondo con colores sombreados. En el inicio hemos asignado la paleta de la barra tanto a pal2 como a pal3. Ahora asignamos la pal3 para la barra. Aparentemente ésta prueba es como la PRUEBA 01. Pero hay diferencias:

  • Los píxels con el color 14 (amarillo) no se ven, en su lugar se ven aquellos del fondo con colores normales. Dan la sensación de ser brillantes, pero realmente los colores del fondo aparecen con el brillo normal. Engaña.
  • Los píxels con el color 15 (blanco) no se ven, en su lugar se pinta el fondo con color shadow pero… como todo el fondo es shadow no se aprecia (no existe un doble shadow).

Se aprecia mejor al hacer zoom:

Mueve la barra para ver el efecto sobre los tiles del fondo.

 

PRUEBA 05. Fondo sin prioridad. Barra con prioridad. Barra con paleta 3.
Fondo con colores sombreados. Es idéntico al ejemplo anterior, pero como ahora la barra de colores tiene prioridad, los colores aparecen con colores normales (excepto con colores 14 y 15).

 

 

Ahora vamos a poner prioridad al fondo a ver qué pasa.

 

PRUEBA 06. Fondo con prioridad. Sprites sin prioridad. Barra con paleta 3.
Fondo con colores normales. Los sprites aparecen por detrás de los tiles del fondo al tener menos prioridad. Los sprites se ven porque los tiles con el color 0 del fondo (azul claro), no se pintan (al ser el color 0 de la barra). El fondo es azul claro porque precisamente el background se pinta del color 0 de la primera paleta, que es la paleta del fondo.

Captura003

Los colores de los sprites son colores normales (excepto con colores 14 y 15 para la barra de colores, que usa la pal3).

 

PRUEBA 07. Fondo con prioridad. Sprite sin prioridad. Barra con paleta 3.
Esta prueba es la misma que la anterior pero hemos movido el sprite de Sonic a una zona más visible, para que se aprecie las transparencias de los colores 14 y 15. Mueve la barra y ponla sobre Sonic para observar el efecto.

 

 

PRUEBA 08. Fondo con prioridad. Sprite con prioridad. Barra con paleta 3.
Esta prueba es la misma que la anterior pero con prioridad a ambos sprites. Se aprecian las transparencias de los colores 14 y 15. Mueve la barra y ponla sobre Sonic y sobre el escenario para observar el efecto.

Captura006

 

No está nada mal para comenzar.  Tenéis el código para compilar en mi github, además he dejado un par de paletas (del fondo y los sprites) por si queréis cambiar los colores y probar cosas. Veremos más cosas en la siguiente entrada.

 

GITHUB

El código de esta lección, y de todas las demás, lo podrás encontrar en mi github:

https://github.com/danibusvlc/aventuras-en-megadrive