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!
textures
compression
Toji
fuente
fuente
Respuestas:
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.
fuente
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 = 48
bytes 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 = 12
bytes.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.
fuente
@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.
fuente