¿Cómo se obtiene un color decente de 2BPP?


11

He estado buscando texturas de PowerVR y me he encontrado con varias texturas que aparentemente son de 2 bits por píxel. Esto, francamente, me aturde. ¿Cómo se consigue una preservación del color a mitad de camino cuando solo tiene 4 estados posibles por pi por píxel? Me encantaría cualquier recurso que hable sobre la compresión detrás de tal hazaña. ¡Gracias!


Con JPG, puede obtener un color decente con menos de 1BPP :)
Ivan Kuckir

Respuestas:


13

La codificación PVRTC 2BPP, como se presenta en este documento, divide una imagen en bloques de 8x4-texel, y comprime cada bloque de manera que solo se almacenan dos colores RGB para cada bloque de treinta y dos texel.

Ninguno de los treinta y dos texels almacena un color propio: cada texel solo almacena información sobre cómo combinar entre los dos colores RGB de su bloque de 8x4 texel.

Si la imagen de origen tiene un bloque de texel 8x4 con un arco iris de 32 colores, la compresión PVRTC 2BPP hará un trabajo muy pobre para mantener su calidad, porque en PVRTC 2BPP cada bloque de texel 8x4 tiene solo dos colores RGB para combinar.


¡Fascinante! Muchas gracias. Lamentablemente, tengo muchos problemas para cargar el papel al que se vinculó. ¿Quizás esté alojado en el EC2 de Amazon? ;)
Toji

6

La compresión de textura no comprime píxeles. Comprime bloques de píxeles. Cuando se hace referencia a un píxel individual, la GPU calcula qué bloque representa el píxel. Luego procesa todo el bloque para obtener el color de ese píxel.

Un ejemplo

Supongamos que el tamaño del bloque es de 4x4 píxeles en una textura RGB. Sin comprimir, cada bloque consume 4x4x3 = 48bytes en la memoria de textura.
Ahora el algoritmo de compresión calculará el promedio de cada canal (RGB) y lo almacenará con el bloque (3 bytes). Ahora demos a cada píxel 2 bits para ajustar el promedio de modo que el píxel esté más cerca de su color original. Eso es otro 4x4x2x3/8 = 12bytes.
El total de bytes utilizados por este compresor recién inventado es de 15 bytes por bloque, una relación de compresión del 31.25%.

Mi mítico compresor usa 7.5 bpp. Eso no es tan bueno como el pvrtc de 2 bpp puede lograr, pero ahora tienes una idea aproximada de cómo se pueden lograr 2 bbp.

Actualización:
Acabo de mirar la página de Wikipedia para pvrtc . Parece que pvrtc no usa la compresión tradicional basada en bloques. Aquí hay un documento que describe la forma en que funciona la compresión basada en bloques y cómo difiere pvrtc. De particular interés: los filtros basados ​​en bloques pueden producir imágenes decentes usando 4bpp (no alfa), mientras que nvrtc puede hacerlo con 2bpp.


1

@Toji, el sitio en el que se encuentra el periódico es un poco temperamental, pero funcionó para mí esta mañana. De lo contrario, si tiene acceso a ACM / SIGGRAPH, está alojado aquí . Curiosamente, también estaba en el sitio web del desarrollador IMG / PowerVR (registro gratuito), pero parece que no puedo encontrar la sección correcta. :-(

[ACTUALIZACIÓN] Todavía está en el sitio IMG aquí [/ ACTUALIZACIÓN]

@bmcnet: PVRTC no divide la textura en bloques como, por ejemplo, ETC o S3TC. FWIW, experimenté con texturas basadas en bloques, pero no pude encontrar una manera de empacar suficientes datos en bloques autocontenidos y aún así obtener los resultados que quería. En cambio, es un poco más un sistema de compresión de textura 'global'. Tiene 2 imágenes de baja resolución que aumenta bilinealmente a la resolución de destino, y luego las mezcla en una base de texel por texel.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.