De Colores a Texturas – XNA


Siguiendo con los tutoriales de manejo de los Colores de las texturas, voy a mostrar un ejemplo de cómo reemplazar un color por una textura, más exacto por los colores de otra textura.

Es más o menos, como hacen con la técnica de Chroma Key, que es muy usado en las películas:

 

Para iniciar, voy a crear un “super” paisaje, como los que pintábamos de niños:

 

Ahora, voy a conseguir en google las texturas que voy a usar, texturas para el cielo, las montañas, la madera, las hojas, el techo de la casa y las paredes:

 

Ahora, creamos el proyecto y declaramos las variables necesarias:

Texture2D paisaje;
Texture2D arbol;
Texture2D madera;
Texture2D nube;
Texture2D mountain;
Texture2D ladrillo;
Texture2D techo;
Int32 ventanaX = 800;
Int32 ventanaY = 600;
Color[] paisajeColorArray;

Creamos un método que va a obtener los datos de la textura y los va a devolver en una matriz doble de Colores:

private Color[,] TexturaAMatrizDoble(Texture2D textura)
        {
            Color[] colors1D = new Color[textura.Width * textura.Height];
            textura.GetData(colors1D);
            Color[,] colors2D = new Color[textura.Width, textura.Height];
            for (int x = 0; x < textura.Width; x++)
                for (int y = 0; y < textura.Height; y++)
                    colors2D[x, y] = colors1D[x + y * textura.Width];
            return colors2D;
        }

Como dije este método me devuelve en una matriz doble, los datos de la textura, más o menos en la siguiente imagen se muestra:

 

Este método lo vi en la página de Riemers .

Ahora creamos una función, que va a ser la encargada de recorrer cada Color de la textura, y luego reemplazarlo por su textura correspondiente:

protected void pagarTextura()
        {
            Color[,] groundColores = TexturaAMatrizDoble(mountain);
            Color[,] nubesColores = TexturaAMatrizDoble(nube);
            Color[,] techoColores = TexturaAMatrizDoble(techo);
            Color[,] ladrilloColores = TexturaAMatrizDoble(ladrillo);
            Color[,] arbolColores = TexturaAMatrizDoble(arbol);
            Color[,] maderaColores = TexturaAMatrizDoble(madera);
            Color[] nuevosColores = new Color[ventanaX * ventanaY];
            for (int x = 0; x < ventanaX; x++)
            {
                for (int y = 0; y < ventanaY; y++)
                {
                                     if (paisajeColorArray[x + y * ventanaX] == new Color(38, 127, 0, 255))
                                           nuevosColores[x + y * ventanaX] = groundColores[x % mountain.Width, y % mountain.Height];
                                     else if (paisajeColorArray[x + y * ventanaX] == new Color(0, 38, 255, 255))
                                           nuevosColores[x + y * ventanaX] = nubesColores[x % nube.Width, y % nube.Height];
                                     else if (paisajeColorArray[x + y * ventanaX] == new Color(255, 43, 60, 255))
                                           nuevosColores[x + y * ventanaX] = techoColores[x % techo.Width, y % techo.Height];
                                     else if (paisajeColorArray[x + y * ventanaX] == new Color(128, 128, 128, 255))
                                           nuevosColores[x + y * ventanaX] = ladrilloColores[x % ladrillo.Width, y % ladrillo.Height];
                                     else if (paisajeColorArray[x + y * ventanaX] == new Color(108, 255, 40, 255))
                                           nuevosColores[x + y * ventanaX] = arbolColores[x % arbol.Width, y % arbol.Height];
                                     else if (paisajeColorArray[x + y * ventanaX] == new Color(127, 51, 0, 255))
                                           nuevosColores[x + y * ventanaX] = maderaColores[x % madera.Width, y % madera.Height];
                                     else
                                           nuevosColores[x + y * ventanaX] = paisajeColorArray[x + y * ventanaX];
                }
            }
            paisaje.SetData(nuevosColores);
        }

Como ven, para cada textura le creamos una matriz doble, luego recorremos la textura original, y si el color pertenece al que tenemos pintado, lo reemplazamos con el color de la textura de reemplazo si no, dejamos el color original, al final “pegamos” los nuevos colores a la textura.

Para saber qué combinación del color es el que vamos a reemplazar, podemos usar la aplicación que hice.

Cargamos las texturas (LoadContent)

paisaje = Content.Load<Texture2D>("paisaje");
arbol = Content.Load<Texture2D>("hojas");
madera = Content.Load<Texture2D>("madera");
nube = Content.Load<Texture2D>("nube");
mountain = Content.Load<Texture2D>("mountain");
ladrillo = Content.Load<Texture2D>("ladrillo");
techo = Content.Load<Texture2D>("techo");
paisajeColorArray = new Color[paisaje.Width * paisaje.Height];
paisaje.GetData(paisajeColorArray);
pagarTextura();

Y las dibujamos:

spriteBatch.Begin();
spriteBatch.Draw(paisaje, new Vector2(0, 0), Color.White);
spriteBatch.End();

Bien, eso es todo, la imagen final queda así:

Código Fuente: Aquí

Un pensamiento en “De Colores a Texturas – XNA

  1. Muy buen post lo estaba buscando ya que estoy cursando las ultmas materias en un terciario y justo en estas ultimas materias me cruse con el xna y la peforman que exige el docente me puso de lo duro y bueno eso es normal hay que adactarce a eso y estudiar.
    Gracias por el aporte

Deseas comentar o sugerir algo?

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s