Texturas en OpenGL

Objetos Textura

Hasta el momento se ha visto solo algunos de los estados que afectan a una textura, antes de ser mostrada en pantalla, si una aplicación requiere un gran número de texturas trabajando al mismo tiempo (un videojuego, editor 3d, CAD), ajustar estos parámetros para cada textura por aparte cada vez que se muestra, lo que resulta dispendioso e ineficiente en términos de transferencias de memoria y procesamiento. Es por esto que OpenGL ofrece los Texture Object, que básicamente contienen los datos correspondientes a una textura y todos los estados asociados para presentarla.

Primero es necesario reservar identificadores para las objetos textura, esto se hace mediante la función:

void glGenTextures(GLsizei n, GLuint *textures);

donde n es la cantidad de identificadores a reservar y *textures es un arreglo que contiene n identificadores válidos, después de llamada la función. La especificación indica que los identificadores de objetos textura serán siempre enteros positivos y que el identificador 0 siempre esta reservado. Una vez estos identificadores han sido creados es necesario asociar los estados y los datos necesarios al objeto textura que indica el identificador, esto se hace mediante:

void glBindTexture( enum target, uint texture );

donde target indica el tipo de textura de la cual se quiere crear un objeto, en este caso GL_TEXTURE_2D y texture es uno de los identificadores válidos obtenidos con glGenTextures(). Al llamar esta función por primera vez los datos y estados son asociados con el identificador y pueden ser recuperados posteriormente con otro llamado de glBindTexture(), con el parámetro de un identificador que tenga asociado un objeto inicializado. Cuando el programa termine, los texture objects deben ser eliminados mediante la función:

void glDeleteTextures( sizei n, uint *textures );

que tiene los mismos parámetros de glGenTextures(), pero en este caso se eliminan n objetos asociados con los identificadores almacenados en textures .

Un detalle acerca de los objetos textura es que OpenGL genera una copia de los datos de la textura y maneja de manera automática en donde están estos, bien sea en la memoria del sistema o en la de video. Las texturas en memoria de video son llamadas huésped (resident) y es fácil determinar si una textura es huésped o no, mediante la función:

boolean glAreTexturesResident( sizei n, uint *textures, boolean *residences );

que indica que se chequeen n identificadores almacenados en textures y en residences se devuelve para cada uno true o false dependiendo de si el objeto textura es huésped o no.

La colocación en la memoria de video, que es de más alto rendimiento para este tipo de operaciones, se lleva a cabo mediante un algoritmo de mayor utilización; esto es, si una textura es utilizada con mayor frecuencia, esta se almacenará preferente en memoria de video con respecto a una textura con poca utilización. Es posible indicar al API la prioridad para las texturas que estamos utilizando mediante:

void glPrioritizeTextures( sizei n, uint *textures, clampf *priorities );

donde en el arreglo priorities se indica con valores de cero a uno [0,1] la prioridad a dar a cada una de las texturas, siendo 0 menor prioridad y 1 mayor prioridad. Las texturas con mayor prioridad se mantendrán en memoria de video cuando esta cerca del límite de capacidad, mientras que las de baja prioridad se llevarán a memoria de sistema para crear espacio de alto rendimiento.

Ejemplo Texturas

Este ejemplo muestra el uso de los objetos texturas, variando los datos y los parámetros (filtros) para cada uno de los cuatro cubos. Al igual que en el anterior ejemplo, el código para cargar la textura desde el disco es de Chris Leathley y se puede encontrar en http://members.iinet.net.au/~cleathley/openGL/TextureLoader.htm

download


Descargar:	texturasb.rar
Version:	0.1
Actualizado:	December 21, 2009
Tamaño:		168.43 KB

Este tutorial ha abarcado conceptos básicos relacionados con el manejo de texturas, posterior a este se encuentran muchos temas relacionados, como son el de iluminación-texturizado “simultaneos”, blend modes, multitexturing, point sprite texture y algunas extensiones con efectos interesantes.

1 2 3

Compartir esta entrada

DiggReddit