Texturas en OpenGL

Mapeo de texturas: Debido a una textura es una imagen rectangular y una primitiva no necesariamente lo es, se debe especificar la forma en que la textura se “acoplará” a la primitiva, esto se hace suministrando la coordenada denominadas s, t (en los programas de diseño generalmente se denominan u,v ). Estas coordenadas se suministran para cada vértice mediante el comando:

glTextureCoord{1234}{sifd}( T coords)

que para el caso de texturas bidimensionales tomaría la forma usual de glTexture2f(GLfloat param1, GLfloat param2); , mientras que los otros parámetros corresponden a textura 3d (u=0) y escala (w = 0).

Coordenadas ST OpenGL

La imagen muestra a la izquierda una textura en el espacio (s,t) y a la derecha un triángulo con la textura aplicada, mostrando las coordenadas (s,t) para cada vértice de la primitiva. El espacio (s,t) es normalizado, así que la textura sin importar el tamaño siempre va estar contenida entre las coordenadas flotantes (0.0, 0.0) y (1.0, 1.0). Para asociar las coordenadas de textura basta con dar las (s,t) antes de las de cada vértice dentro de los llamados glBegin() – glEnd().

Ejemplo Texturas

Este ejemplo de texturas muestra un cubo texturizado a partir de rectángulos, variando para algunas caras las coordenadas de textura. El ejemplo se hizo utilizando la libreria para cargar imágenes de Chris Leathley que se puede encontrar en http://members.iinet.net.au/~cleathley/openGL/TextureLoader.htm

download


Descargar:	texturasa.rar
Version:	0.1
Actualizado:	December 21, 2009
Tamaño:		176.66 KB

Parámetros de textura: Una vez cargada la textura, es posible ajustar algunos parámetros que modifican la manera en que será vista cuando se aplique sobre una primitiva, esto se hace mediante la función:

void glTexParameterf( enum target, enum pname, enum tparam );

De nuevo target es GL_TEXTURE_2D para el caso que se está tratando, pname corresponde al nombre del parámetro a ajustar y tparam al valor de este parámetro, una lista de posibles valores se puede observar a continuación (el listado completo se encuentra en la sección de texturizado de la especificación 2.1 del API).

Pname tparam
GL_TEXTURE_WRAP_S GL_CLAMP, GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT, GL_CLAMP_TO_BORDER
GL_TEXTURE_WRAP_T GL_CLAMP, GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT, GL_CLAMP_TO_BORDER
GL_TEXTURE_MIN_FILTER GL_NEAREST, GL_LINEAR, GL_NEAREST_MIMPMAP_NEAREAST, GL_NEAREST_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_LINEAR
GL_TEXTURE_MAG_FILTER GL_NEAREST, GL_LINEAR

Texture Wrap

Corresponde a GL_TEXTURE_WRAP_S y GL_TEXTURE_WRAP_T Este parámetro sirve para determinar la manera en que se verá la textura, si algún parámetro s o t es mayor a 1.0, los modos son:

  • GL_CLAMP: Recorta la textura una vez esta supera las coordenadas 1.0 en (s,t), dependiendo de los ajustes en los estados (se puede hacer independiente sobre s y t).
  • GL_CLAMP_TO_EDGE: Similar a clamp, con la diferencia que no muestrea el texel del borde.
  • GL_CLAMP_TO_BORDER: Similar a clamp, pero se utiliza el pixel de los bordes, con lo que se extiende como “textura” sobre texels mayores a 1.0 .
  • GL_REPEAT: Después de 1.0 bien sea en s y/o t de acuerdo al ajuste, la textura se repite.
  • GL_MIRRORED_REPEAT: Similar a repeat, pero la textura se alterna en coordenadas, por lo que la textura aparece invertida.

Filtrado de textura

Corresponde a GL_TEXTURE_MIN_FILTER y GL_TEXTURE_MAG_FILTER. Cuando la textura es aplicada sobre un polígono los texels que la componen pueden no tener una correspondencia con los píxeles en pantalla, lo que produce texels que se ven como cuadrados de color cuando la primitiva está cerca de la cámara o como una imagen confusa a la distancia , algunos lo llaman “pixelado”. OpenGL posee formas de suavizar el resultado antes de ser presentado en pantalla, denominados filtros, a saber el MIN (minification) y MAG (Magnification), para cuando el polígono texturizado está lejos y cerca respectivamente. Los filtros a saber son:

  • GL_NEAREAST: Es el filtro más sencillo en términos de procesamiento, simplemente utiliza el texel mas cercano mapeada, así ocupe más de un pixel en pantalla.
  • GL_LINEAR : Utiliza interpolación lineal para aproximar el color de un determinado pixel de acuerdo con el texel correspondiente y sus texels vecinos, en la práctica suaviza la textura para que no se vea pixelada.
  • Mipmaps: Son todas las combinaciones de linear, nearest y mipmap, como por ejemplo GL_LINEAR_MIPMAP_NEAREST, que utilizan el filtro sobre el nivel inferior y superior del mipmap respectivamente y luego “promedian” el resultado para mostrarlo en pantalla.

Estos son los filtros básicos que posee OpenGL, adicionalmente mediante fragment shaders o extensiones es posible utilizar filtros de mayor calidad como bilinear, trilinear y anisotropic.

1 2 3

Compartir esta entrada

DiggReddit