Así que he creado una textura. He guardado la RGB con compresión BC7, luego agregó el canal alfa [mapa especular] con diferentes niveles de escala de grises y guardó el archivo nuevamente como RGBA con compresión BC7. El archivo resultante tiene el mismo tamaño que el que no tiene alfa, pero contiene información adicional: canal alfa. ¿Como es posible? No se puede comer pastel y comer pastel, según tengo entendido, así que ¿hay algún compromiso para garantizar el mismo tamaño?
Estoy usando Photoshop con el complemento Intel DDS.
Respuesta
BC7 siempre codifica efectivamente 4 canales. Eso es parte de la naturaleza del formato. Activar alfa significa que el compresor leerá y utilizará el valor alfa en su imagen de origen, pero eso es todo.
Todas las imágenes comprimidas BC7 de una dimensión determinada tienen el mismo tamaño, ya que BC7 comprime cada 4×4 grupo de texels en 128 bits. Pero eso no significa que tengan la misma calidad .
BC7 es un formato de codificación adaptativo. Si bien cada bloque tiene un tamaño fijo (tanto espacial como bit a bit), cada bloque almacena cuántos canales se comprime realmente ese bloque y la forma en que se correlacionan entre sí. Las detalles son complejos , pero la ventaja general es que el compresor determina por bloque qué tipo de compresión funciona mejor para un bloque en particular. Si el compresor puede mirar un bloque y ver que el alfa para todos los texels es 1.0, entonces puede gastar más bits de los 128 bits en los colores y menos en el alfa.
Como tal, una textura " sin alfa " es exactamente como una textura con alfa donde cada texel tiene un alfa de 1. Estos bloques gastarán la mayor parte de su bits en las partes no alfa de los texels, desperdiciando solo algunos bits en un campo " modo " que le permite al descompresor saber el alfa es una constante 1.0.
Esto también significa que, si su textura tiene un alfa variable, pero partes de ella tienen un alfa constante, BC7 puede codificar estas áreas alfa constantes con menos bits, de modo que más los bits se pueden gastar en una codificación de color mejorada.
Así que no debería sentir que hay un problema porque los dos conmutadores de compresión salieron con el mismo número de bytes.
Respuesta
Aquí hay un ar artículo sobre el formato BCn: haz clic en mí . Está escrito por Nathan Reed, quien es bastante activo en este sitio. Así que probablemente pasará de largo y responderá su pregunta con más detalles, aunque creo que el artículo le explicará todo lo que necesita saber.
La parte más relevante para su pregunta parece ser esta sección del artículo:
BC significa «compresión de bloque», y los formatos BCn todos operan en términos de Bloques de píxeles de 4 × 4. Todas las imágenes se dividen en estos pequeños bloques, y cada bloque es autónomo: los datos para decodificarlos están todos en un fragmento contiguo en la memoria . Además, el tamaño de cada bloque comprimido es fijo: 8 o 16 bytes , según el formato BCn que se utilice. Esto representa una relación de compresión de 4: 1 u 8: 1, si la imagen de origen está en formato RGBA de 8 bits.
Siempre que su píxel el recuento no cambia, el tamaño de la textura tampoco cambia. Sin embargo, cuantos más canales use (solo 3 y 4 son compatibles con BC7 según la documentación de Microsoft ), menos información podrá almacenar por canal de color en un cuadra. Esto significa que pierde más información debido a la compresión cuando usa RGBA en lugar de RGB.