Informàtica gràfica 7. Textures

En OpenGL existeixen textures en 1, 2 i 3 dimensions, encara que les més utilitzades són les de 2 dimensions. Una textura és tipus un mapa de píxels on cadascún es pot referenciar per les seues coordenades (x, y).

Els passos per a utilitzar-les són els següents

  • Crear un objecte textura i especificar aquesta textura per a un objecte
  • Indicar com s’aplicarà la textura a cada píxel
  • Habilitar l’utilització de textures
  • Dibuixar l’escena assignant a cada vèrtex la seua corresponent coordenada de textura

Objectes textura

El primer que hem de fer abans de crear un objecte textura és llegir-lo des d’un fitxer. La següent funció ens permet carregar en memòria una imatge de 256×256 píxels en format tga.

/*********************************************************************/
/* Lee una imagen de textura en formato tga */
/* Parametros --> char *fichero : Cadena de caracteres con el nombre */
/* del fichero */
/* int num: Numero que identifica la textura */
/* Salida --> Ninguna */
/*********************************************************************/
void leeTextura ( char *fichero, int num) {
int i, j;
char r, g, b, c;
FILE *tga;

/* Apertura del fichero TGA */
if ((tga = fopen(fichero, "rb" )) == NULL)
     printf ( "Error abriendo el fichero: %s\n" , fichero);
else {
/* Lee los 18 primeros caracteres de la cabecera */
for (j=1; j<=18; j++)
fscanf (tga, "%c" , &c);

     /* Lee la imagen */
     for (j=altoTextura-1; j>=0; j--) {
          for (i=anchoTextura-1; i>=0; i--) {
                fscanf(tga, "%c%c%c" , &b, &g, &r);
                texturas[num][j][i][0] = (GLubyte)r;
                texturas[num][j][i][1] = (GLubyte)g;
                texturas[num][j][i][2] = (GLubyte)b;
          }
     }
fclose(tga); /* Cierre del fichero TGA */
}
}

Com el tamany d’una textura generalment no és el mateix que el del polígon, necessitem també especificar com es calcularà el color final dels píxels sobre el polígon projectat, a partir de la imatge de textura.

D’altra banda també podem repetir la textura cada cert espai.

Utilitzant altres comandaments que podem consultar en el manual, la funció de càrrega i creació d’un objecte textura ens quedarà així:

void cargaTextura( char *fichero, int num) {
       leeTextura(fichero, num);
       glBindTexture(GL_TEXTURE_2D, nombreTexturas[num]);
       glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
       glTexImage2D(GL_TEXTURE_2D, 0, 3, anchoTextura, altoTextura, 0, GL_RGB, GL_UNSIGNED_BYTE, texturas[num]);
       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
       glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}

Assignació de coordenades de textura

Com en el cas de la iluminació, les coordenades de textura s’assignen als vèrtex de manera que cadascun correspon a un píxel del mapa de textures.

Les funcions per a assignar coordenades de textura a un vèrtex són:

void glTexCoord{1234}{sifd}(TIPO coordenades);
void glTexCoord{1234}{sifd}v(TIPO *coordenades);

I per a activar una textura sobre un objecte:

glEnable ( GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, nombreTexturas[i]);

// llamada a la rutina que pinta el objeto con texturas
pinta_objeto();
glDisable ( GL_TEXTURE_2D);

textures1

El codi de l’anterior objecte texturitzat és el següent:

I el fitxer de textura: