El exceso de accesos a memoria es uno de los mayores causantes de la degradación del desempeño del hardware gráfico moderno. Trabajar con formatos de color de mayor tamaño no sólo implica un aumento en el consumo de la memoria de la GPU; también conlleva un mayor consumo del ancho de banda del bus de comunicación memoria/caché de texturas, lo que provoca un aumento en el tiempo de acceso a la información de textura que no se encuentra en caché. Además, cada color consume más espacio en la caché de texturas, lo que provoca una mayor cantidad de cache misses, lo que reduce aún más el desempeño. Por esta razón, la utilización de formatos de color que permiten representar eficientemente el color se complementa con técnicas de compresión de texturas.
Al realizar la compresión de texturas se busca satisfacer los siguiente requerimientos (Beers, Agrawala, & Chaddha, 1996):
Velocidad de decodificación. El acceso a la información debe realizarse directamente sobre los datos comprimidos y el proceso de decodificación debe ser rápido.
Acceso aleatorio. Dado que no hay un orden preestablecido de acceso a los datos de la textura, cualquier algoritmo de compresión usado debe permitir el acceso aleatorio a los datos.
Tasa de compresión y calidad visual. En un sistema de renderizado de tiempo real, una calidad visual mediocre podría ser tolerada si la tasa de compresión es alta.
Velocidad de codificación. La codificación no suele realizarse en tiempo de ejecución, por lo que no es necesario una alta velocidad de codificación.
La indexación de color, o texturas paletizadas, es la primera técnica de compresión de textura que se propuso (Campbell, DeFanti, Frederiksen, Joyce, & Leske, 1986) y la primera en ser implementada en hardware. Esta técnica puede ser vista como un caso especial de la técnica de cuantización vectorial, en la que cada texel de la textura contiene índices a una tabla o paleta de colores (lookup table) limitada a 16 colores, 256 colores, 16 colores más información alfa o 256 colores más información alfa según el formato seleccionado. Si bien algunas imágenes se comprimen con buenos resultados, en computación gráfica fotorrealista la mayoría de las texturas utilizan paletas de colores de mayor tamaño, siendo los gradientes suaves de color los más perjudicados por la adopción de esta técnica de compresión. Además, cada acceso a textura necesita un acceso extra a la paleta de colores lo que podría resultar en una degradación del desempeño. Actualmente, esta técnica raramente es soportada por hardware, exceptuando dispositivos móviles y consolas de bajas prestaciones como la SONY PSP y Nintendo Wii.
Alternativamente, la información de color podría almacenarse en formatos de color de menor precisión como lo son el formato Bgr565 que utiliza 5 bits para los canales rojo y azul y 6 bits para el canal verde, el
formato Bgra5551 que utiliza 5 bits para cada canal más un bit para el canal alfa y el formato Bgra4444
que utiliza 4 bits para cada canal, incluyendo el canal alfa.
La compresión de texturas S3 (S3TC), normalmente denominada DXT, es una técnica de compresión con pérdida ampliamente utilizada y es soportada en todo hardware gráfico moderno. S3TC es en esencia es una extensión del concepto introducido en 1970 denominado Block Truncation Coding (Delp & Mitchell, 1979) y pueden presentarse de 5 formatos: DXT1, DXT2, DXT3, DXT4 y DXT5.
En S3TC, la textura se divide en segmentos de 4x4 pixeles para luego aplicar una compresión individual a cada segmento. La compresión en los distintos formatos varía solamente en la forma en la que se codifica el canal alfa. Todos los formatos crean una paleta de 4 colores por cada segmento, pero sólo se almacenan los colores de menor y de mayor luminancia; los otros dos colores se calculan como una interpolación lineal de estos colores utilizando un tercio de un color y dos tercios del otro. Además, los colores se almacenan utilizando un formato de 16 bits por color, donde los canales rojo y azul utilizan 5 bits y el verde utiliza 6 bits. Por lo tanto se necesitan 32 bits para almacenar la tabla o paleta de colores y 32 bits para almacenar los índices a la tabla (2 bits por cada texel), reduciendo los 512 bits necesarios para almacenar el segmento a tan solo 64 bits.
En DX1, si el primer color almacenado en la paleta tiene mayor luminancia que el segundo éste se comporta exactamente de la forma previamente expuesta. En cambio, si la luminancia del primer color es menor, el tercer color de la paleta será una interpolación lineal de los dos colores extremos utilizando la mitad de cada color, y el cuarto color de la paleta será un color completamente transparente, permitiendo de esta manera almacenar 1 bit para el canal alfa (0 o 1) a costa de uno de los colores interpolados. La tasa de compresión en este formato es 8:1 si la textura contiene información alfa y 6:1 en caso contrario.
En DX3, la información de color se almacena utilizando el esquema previamente expuesto, pero la información del canal alfa se almacena utilizando 4 bits por texel, por lo que este esquema utiliza 128 bits por segmento: 32 bits para la paleta, 32 bits para los índices a la tabla y 64 para el canal alfa, resultando en una compresión de 4:1. Dado que solo se pueden almacenar 16 valores alfa distintos de igual paso en cada texel, los gradientes suaves en el canal alfa no pueden ser almacenados satisfactoriamente. El formato DX2 es similar a DX3 pero asume que la información de color está pre multiplicada por el canal alfa y típicamente no es soportado.
En DX5, la información alfa se almacena en una paleta de forma similar a la información de color. Se almacena el valor alfa mínimo y el valor alfa máximo, excepto que éstos sean los valores 0 y 1 respectivamente. Si el primer valor almacenado es el mayor entonces se podrán indexar los valores alfa almacenados y 6 valores restantes que surgen de interpolar linealmente estos valores. En cambio, si el primer valor almacenado es menor, se podrán indexar los valores alfa almacenados, 4 valores que surgen de interpolar linealmente estos valores y dos valores extras: el valor completamente transparente y el completamente opaco. De esta forma, DX5 permite cambios graduales de mayor precisión en el canal alfa con respecto al formato DX3. El formato DX4 es similar al DX5 pero asume que la información de color está pre multiplicada por el canal alfa y típicamente no es soportado.
Dado que en S3TC la información de color de la paleta es almacenada utilizando un formato de color de menor precisión, los gradientes suaves pueden verse comprometidos debido a que colores similares podrían llegar a ser representados con los mismos valores en el formato de menor precisión y la compresión en un mismo segmento podría provocar la pérdida de varios colores (Figura 5-8). Conjuntamente, si la imagen contiene grandes variaciones de color en los segmentos, el segmento comprimido podría tener colores no presentes en el segmento original (Figura 5-9). Similarmente, en presencia de bordes y líneas que separan zonas de alto contraste, la compresión S3TC podría provocar la aparición de colores no presentes en el segmento original (Figura 5-10). Sin embargo, esta técnica de compresión ha demostrado ser sumamente útil en la práctica y es ampliamente utilizada. Estos problemas de compresión podrían ser reducidos realizando tratamientos a las texturas no comprimidas, como los expuestos en (Linde, 2005).
Existen otros esquemas de compresión apoyados por hardware, como 3Dc, pero su adopción no ha sido masiva.
(a) (b)
Figura 5-8 (a) Segmento sin comprimir (b) Segmento comprimido utilizando S3TC. Utilizando esta compresión los colores similares podrían perderse.
(a) (b)
Figura 5-9. (a) Segmento sin comprimir (b) Segmento comprimido utilizando S3TC. Utilizando esta compresión los colores sumamente diferentes resultan en colores extraños.
(a) (b)
Figura 5-10. (a) Imagen sin comprimir (b) Imagen comprimida utilizando S3TC. Ambas imágenes fueron saturadas para exponer mejor los resultados. Las zonas de alto contraste podrían provocar la aparición de colores extraños (Linde, 2005).
Los mapas MIP o Mipmaps son un método en el que a la textura principal se le anexan diferentes copias de distintos tamaños. Proveen versiones pre-filtradas de la textura principal, lo que permite reducir artefactos cuando, por ejemplo, en un fragmento debe recuperarse un valor de color de la textura que abarca una zona significativa de la misma y al mismo tiempo permiten aumentar el desempeño; una textura con Mipmaps ocupa el doble de espacio en memoria de GPU, pero si en un momento dado sólo se necesita un mapa MIP pequeño, éste ocupará mucho menos espacio en la caché de texturas (Bjorke, 2005), resultando, en esencia, en un esquema de compresión de texturas que además reduce artefactos a expensas de memoria de GPU. Si la textura de color se aplica sobre un modelo 3D o si se aplica en pantalla escalada al menos a la mitad de tamaño, entonces los mapas MIP resultan en un método de compresión de texturas efectivo (Hargreaves, Texture Filtering: Mipmaps, 2009).