03 - Usando texturas

En esta entrada vamos explicar los fundamentos de como texturizar renderizados. Para ello hay que entender que las coordenadas a aplicar son distintas cuando hablamos de las coordenadas del modelo y cuando hablamos de las coordenadas de la textura, esto se observa fácilmente en el siguiente gráfico:


Lo primero que necesitamos es cargar la textura que vamos a usar, para lo que podemos crear un método que se encargue de ello:
int LoadTexture(string filename)
        {
            if (String.IsNullOrEmpty(filename))
                throw new ArgumentException(filename);
            int id = GL.GenTexture();
            GL.BindTexture(TextureTarget.Texture2D, id);
            Bitmap bmp = new Bitmap(filename);
            BitmapData bmp_data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bmp_data.Width, bmp_data.Height, 0,
            OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, bmp_data.Scan0);
            bmp.UnlockBits(bmp_data);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
            GL.Ext.GenerateMipmap(GenerateMipmapTarget.Texture2D);
            return id;
        }

Esta imagen podría ser un buen ejemplo para hacer las pruebas de carga y renderizado de una textura:


Para poder renderizar la textura que acabamos de cargar, crearemos un cuadrado con dos triángulos como ya aprendimos en el post anterior. Si nos fijamos en el dibujo de las coordenadas, los triangulos deben definirse:
-Triangulo 1: (-0,2, 0.2), (0.2, 0.2), (-0.2, -0.2)
-Triángulo 2: (0,2, 0.2), (0.2, -0.2), (-0.2, -0.2)

Y ahora deberemos definir las coordenadas de la textura para que se alinee como toca, recordando siempre que las coordenadas de la textura deben ir siempre de 0 a 1. Aunque, a veces, esto no sea cierto, pero ahora no nos interesa, ya lo explicaremos más adelante. Así, las coordenadas UV que es como se llaman las coordenadas de las texturas quedarán:
-Triangulo 1: (0, 0), (1, 0), (0, 1)
-Triángulo 2: (1, 0), (1, 1), (0,1)

Trasladando esto a código quedaría:

GL.TexCoord2(0.0, 0.0);
GL.Vertex3(-0.2f, 0.2f, 0.0f);
GL.TexCoord2(1.0, 0.0);
GL.Vertex3(0.2f, 0.2f, 0.0f);
GL.TexCoord2(0.0, 1.0);
GL.Vertex3(-0.2f, -0.2f, 0.0f);
GL.TexCoord2(1.0, 0.0);
GL.Vertex3(0.2f, 0.2f, 0.0f);
GL.TexCoord2(1.0, 1.0);
GL.Vertex3(0.2f, -0.2f, 0.0f);
GL.TexCoord2(0.0, 1.0);
GL.Vertex3(-0.2f, -0.2f, 0.0f);
Con este código renderizaremos un cuadrado con la textura que hemos cargado anteriormente. Ahora tan solo nos quedaría probar a modificar las coordenadas de textura a ver como se comportan.

No hay comentarios:

Publicar un comentario