Transparencias en MD: el truco del almendruco

En el juego Mortal Kombat de Megadrive las sombras de los luchadores
se ven transparentes y preguntas:

Imagen

¿Técnicamente es una transparencia real?

Está claro que no. Una transparencia es la combinación entre los colores de dos pixeles
superpuestos que dan lugar a otro nuevo color.

Si alguien dice que el color de la sombra es negro y el del fondo del suelo marrón clarito (por ejemplo)
y la transparencia resultante es oscura entonces parecerá que es una transparencia real.

Pero... ¿Y si decimos que la sombra es amarilla y el fondo del suelo rojo? Entonces se pilla el truco
de la megadrive porque no podrá mostrar una sombra transparente naranja.

¿Porqué funciona esto con los colores negro/marrón y no con amarillo/rojo?

La megadrive puede mostrar los colores de un componente gráfico en dos tonalidades: claros y oscuros.
Así pues la sombra transparente del Mortal Kombat no es más que los colores del suelo en formato oscuro.


¿Cómo lo hacen?

El problema ahora surge en como coger un trocito del suelo (la proyección de la sombra) y entonces
ponerlo en color oscuro.

Aquí viene un truquillo con los fondos, los sprites y sus prioridades.

La megadrive tiene todos los gráficos almacenados en tiles. Esos tiles tendrán zonas que se dibujan y zonas que no.

Detalles a tener en cuenta:

El plano de fondo del suelo se compone con esas tiles en color oscuro.
Se crea otro suelo con sprites con los mismos tiles que forman el fondo pero en color claro.

La sombra son sprites pero se le da una prioridad para que se pinte por por debajo del fondo
pero encima de los sprites del suelo.

El truco es decir que el sprite de la sombra se pinte por debajo del fondo. Lo que ocurre ahora es que el sprite
se sigue pintando pero el tile que tiene asociado deja de tener valor y en su lugar se asocia el trocito
de fondo (suelo) que queda encima de él (que está en tonos oscuros). Es decir tenemos ahora un sprite de la sombra con el contenido del suelo en color oscuro.
Y... como hemos definido que el sprite de la sombra quede por encima de los sprites del suelo en colores claros
ya tenemos el truco.

¡¡TACHÁNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!!

La magia está servida.
La verdad que programar hasta 32 bits tenía mucha chicha y había que dar muchas vueltas, eso con el tiempo por suerte (o por desgracia) ya no es necesario.
Las limitaciones de las maquinas antiguas hacían despertar el ingenio de los programadores, bien por ellos.
Sube el codigo, para echar un vistazo

Saludos
No tengo código fuente, sólo la idea en que han podido hacerlo.
Dudo mucho que este hecho asi, me juego algo que son sprites negros que cambian de su posicion a fuera de la pantalla (resultando en un parpadeo rapido y generando la 'transparencia') almenos asi es como se hace en el 99% de los juegos y cuando no es asi es con dithering
Pues yo soy más de la opinión de jordirafel, no tengo claro que se haya hecho así. La técnica que describes se basa en tiles y si realmente todo consistiera en seleccionar el tile a pintar se notaría el efecto cuadriculado, ya que los tiles son eso, cuadraditos, mientras que las sombras parecen perfectamente definidas. Con fotos tan pequeñas o videos de youtube es difícil ver realmente cómo lo han hecho, si alguien tuviera una MD a mano y pudiera arrojar luz :-).

En verdad es un debate muy interesante, el relacionado con los trucos de programación para conseguir efectos visuales. Que muy a las malas mire usted, usamos tramas como se han usado de toda la vida y aquí no pasa nada, de hecho a mí nunca me disgustaron pero todo fue salir la SNES y parece que se demonizaron cuando placas tan prestigiosas como la CPS tiraron de ellas.
La sombra son sprites pero se le da una prioridad para que se pinte por por debajo del fondo
pero encima de los sprites del suelo.


No entiendo eso... el suelo que yo sepa no está formado por sprites
Yo también estoy con jordirafel y AxelStone, dudo mucho que se haya usado esa técnica. Lo normal era usar el entrelazado para pintar un frame sí y otro no las líneas pares e impares del sprite, quedando de esa forma una transparencia muy conseguida.
Así se hace en el Seiken Densetsu 3 de SNES, por ejemplo.
En este juego ni las sombras parpadean ni están hechas con tramas.

He dado la explicación precisamente porque este juego usa un truco muy bueno para simular transparencias y no
lo que usaban el resto de juegos de la mega.

El fondo está hecho con tiles como todos los fondos del mundo de la megadrive pero en color oscuro.
Encima de ese fondo se pinta (ya con sprites) los mismos tiles pero en color claro.
La sombra no es más que un conjunto de sprites que se dibujan detrás del fondo y encima del fondo construido con sprites.
zarkon escribió:En este juego ni las sombras parpadean ni están hechas con tramas.

He dado la explicación precisamente porque este juego usa un truco muy bueno para simular transparencias y no
lo que usaban el resto de juegos de la mega.

El fondo está hecho con tiles como todos los fondos del mundo de la megadrive pero en color oscuro.
Encima de ese fondo se pinta (ya con sprites) los mismos tiles pero en color claro.
La sombra no es más que un conjunto de sprites que se dibujan detrás del fondo y encima del fondo construido con sprites.


Es que no se te entiende nada

Siempre es bueno saber tecnicas, porque para resolver un problema, cada uno se ingenia algo diferente

Pero no sirve de nada que lo expliques asi, tienes q indicar que planos de scroll, priodidades, etc


La Megadrive tiene tres planos de scroll, ScrollA, ScrollB y Window
El plano Window tiene prioriad sobre el Plano A
Los tiles tienen prioridad 0 o 1

Indica si se usa el plano window para el truco, o que planos de scroll intervienen en el, etc entonces sera mas entendible

Saludos
Me suena que en el foro de vandal retro hubo un post tratando este tema, aunque no recuerdo si se saco una conclusion o no. Luego lo buscare.
Estaba pensando, en como lograr este efecto, y devido a que aun no logro entender la explicacion del amigo zarkon, se me ocurrio que los modos shadow/highlight , podrian resolver este problema de sombras "translucidas"

Al final resultaron 4 lineas de ensamblador para activar los modos


Highlight - Este modo es simple, al activarlo, el color 14 de la paleta 3, da brillo al pixel de fondo
Imagen



Shadow - Aqui es mas complejo, requiere dos planos de scroll. El A en prioridad baja, y el B con prioridad alta, y un sprite con transparencia en color 15 de la paleta 3

EDITO: Acabo de hacer un codigo, un poco mas optimizado, donde puedo hacer shadow solo con un plano en prioridad alta! genial, se obtiene shadow y aun queda un plano libre

Imagen

http://www.akihabara-online.com/Megadrive/Ejemplos/HS/sombrasyluces.zip
Googleando un poco he encontrado esto, básicamente el truco
es el mismo pero además hablan de hacerlo al revés, con el fondo oscuro y el sprite claro.

http://gendev.spritesmind.net/forum/vie ... hp?p=17065
zarkon escribió:Googleando un poco he encontrado esto, básicamente el truco
es el mismo pero además hablan de hacerlo al revés, con el fondo oscuro y el sprite claro.

http://gendev.spritesmind.net/forum/vie ... hp?p=17065


No tengo el codigo del MK delante, pero realmente, teniendo en cuenta la facilidad de trabajar con Highlight/Shadows, no creo q usaran ninguna tecnica de sprites

Dos cosas me hacen suponer que probablemente el efecto este echo con shadow:

1) Que las sombras no pueden pasar del plano de prioridad alta al de baja
2) Que cuando se necesita de usar un plano o paleta extra para indicadores, letras, etc las sombras desaparecen


Saludos
Ummm... en eso tienes razón porque cuando aparece el Fight las sombras
desaparecen.
Que pasada de trabajos.
Poned el juego y veis que las sombras ni parpadean ni tienen tramas.

Buenisima explicación de cómo esta hecho, siempre me lo había preguntado.

Un saludo.
theelf escribió:Estaba pensando, en como lograr este efecto, y devido a que aun no logro entender la explicacion del amigo zarkon, se me ocurrio que los modos shadow/highlight , podrian resolver este problema de sombras "translucidas"

Al final resultaron 4 lineas de ensamblador para activar los modos

Highlight - Este modo es simple, al activarlo, el color 14 de la paleta 3, da brillo al pixel de fondo
Imagen

Shadow - Aqui es mas complejo, requiere dos planos de scroll. El A en prioridad baja, y el B con prioridad alta, y un sprite con transparencia en color 15 de la paleta 3

EDITO: Acabo de hacer un codigo, un poco mas optimizado, donde puedo hacer shadow solo con un plano en prioridad alta! genial, se obtiene shadow y aun queda un plano libre

Imagen

http://www.akihabara-online.com/Megadrive/Ejemplos/HS/sombrasyluces.zip


Amigo, esta explicación sí queda mucho más clara :-). Pues nada, duda despejada, no tenía ni idea que la MD tenía los modos Shadow / Highlight, claramente orientados a simular luces y sombras. En cierto modo era la antesala de las transparencias, no es una rutina programada sino una característica de la MD en sí.
zarkon escribió:Ummm... en eso tienes razón porque cuando aparece el Fight las sombras
desaparecen.


Ayer antes de acostarme lo probé para ver las sombras y fue lo primero que me di cuenta [+risas]
Gracias theelf por la base tecnica con tus conocimientos de programacion de la megadrive ;)
19 respuestas