Compresión de bloques

A partir de Windows 8.1, Direct2D admite varios formatos de píxeles comprimidos de bloque. Además, Windows 8.1 contiene un nuevo códec DDS del componente de creación de imágenes de Windows (WIC) para habilitar la carga y el almacenamiento de imágenes comprimidas en bloque en el formato de archivo DDS. La compresión de bloques es una técnica para reducir la cantidad de memoria gráfica que consume el contenido del mapa de bits. Mediante la compresión de bloques, la aplicación puede reducir el consumo de memoria y los tiempos de carga de las mismas imágenes de resolución. O bien, la aplicación puede usar más o más imágenes de resolución mientras sigue consumiendo la misma superficie de memoria de GPU.

Las aplicaciones de Direct3D han usado la compresión de bloques durante mucho tiempo, y con Windows 8.1 también está disponible para desarrolladores de aplicaciones estándar y Direct2D.

En este tema se describe cómo funciona la compresión de bloques y cómo usarla en WIC y Direct2D.

Acerca de la compresión de bloques

La compresión de bloques (BC) hace referencia a una clase de técnicas de compresión para reducir los tamaños de textura. Direct3D 11 admite hasta 7 formatos BC diferentes en función del nivel de característica. En Windows 8.1 Direct2D presenta compatibilidad con los formatos BC1, BC2 y BC3 que están disponibles en todos los niveles de características.

Funcionamiento de la compresión de bloques

Todos los formatos comprimidos de bloques usan la misma técnica básica para reducir el espacio consumido por los datos de color. En esta sección se resume el algoritmo más sencillo, BC1. Para obtener una explicación más detallada, vea Bloquear compresión.

En primer lugar, la imagen se divide en bloques de 4 a 4 píxeles. Cada bloque se comprime por separado.

Nota:

Esto significa que el ancho y el alto de una imagen deben tener un múltiplo de 4 píxeles para que se comprima en bloque.

 

En esta imagen de ejemplo se muestra un bloque de 4 x 4 píxeles dentro de una imagen.

una imagen de ejemplo muestra un bloque de 4 x 4 píxeles dentro de una imagen.

A continuación, dentro de un bloque de 4 a 4, se seleccionan dos colores de "referencia" y se codifican como dos valores de 16 bits (5 bits rojo, 6 bits verde, 5 bits azules). La elección de estos colores afecta significativamente a la calidad de la imagen y no estrivial. Dos colores intermedios se calculan interpolando linealmente entre los dos colores de referencia en el espacio de colores RGB. Esto produce un total de 4 colores posibles diferentes; a cada color se le asigna un valor de índice de dos bits. Sin embargo, tenga en cuenta que solo se deben almacenar los dos colores del punto de conexión, ya que la interpolación es fija.

En esta ilustración, los colores 0 y 3 se seleccionan como colores de "referencia" para el bloque, mientras que los colores 1 y 2 se calculan mediante interpolación lineal.

Diagrama que muestra el cálculo de 4 valores de color para representar el bloque.

Por último, cada píxel del bloque se asigna a uno de los cuatro colores calculados anteriormente y cada píxel se codifica mediante el valor de índice de dos bits.

La cantidad total de datos usados para representar estos 16 píxeles es:

16 bits [to define a reference color] * 2 + 2 bits * 16 [number of pixels] = 64 bits

Esto da como resultado una densidad media de 4 bits por píxel. Para la comparación, el formato de píxeles DXGI_FORMAT_B8G8R8A8_UNORM común consume 32 bits por píxel.

En este diagrama se muestra que cada píxel se codifica como un índice de 2 bits. Todo el bloque se codifica en 64 bits.

calculando 4 valores de color para representar el bloque.

Hay variaciones para admitir datos alfa y diferentes números de canales de color. BC6H y BC7 usan algoritmos significativamente diferentes para admitir contenido de alto rango dinámico (HDR) y aumentar la calidad de la imagen, respectivamente.

Formato de archivo de DirectDraw Surface (DDS)

Los datos comprimidos en bloques se almacenan normalmente en archivos de DirectDraw Surface (DDS). Es posible que esté familiarizado con los archivos DDS si es desarrollador de Direct3D. Ten en cuenta que Direct2D solo admite ciertas características de DDS; para obtener más información, vea Requisitos de DDS.

Ventajas de la compresión de bloques

Los formatos comprimidos de bloques difieren de los formatos comunes de compresión de imágenes del sector, como JPEG, en que los formatos BC son compatibles de forma nativa con gpu modernas. Esto significa que puede cargar directamente una imagen comprimida en bloque en la GPU sin descodificación ni descompresión. Los formatos BC consumen de 4 a 8 bits por píxel en promedio; en comparación con un mapa de bits BGRA de 32 bits sin comprimir típico, esto da como resultado un ahorro de memoria del 75 % al 87,5 %. Además, dado que no hay ningún paso de descodificación, el tiempo de carga de una imagen BC se reduce significativamente en comparación con los formatos como JPEG.

Cuándo usar la compresión de bloques

Debes considerar el uso de imágenes comprimidas en bloque en tu aplicación en lugar de otros formatos como JPEG si quieres reducir el consumo de memoria de los mapas de bits o quieres reducir los tiempos de descodificación y carga.

Sin embargo, la compresión de bloques no es adecuada para todos los casos y requiere algunos inconvenientes. En primer lugar, los algoritmos de compresión de bloques son pérdida. La compresión de bloques funciona bien con contenido fotográfico natural, pero puede introducir artefactos visuales no deseados en imágenes con límites de contraste alto y agudos, como capturas de pantalla generadas por el equipo. Debe asegurarse de que los recursos de imagen comprimidos en bloques tienen una calidad de imagen aceptable antes de usarlas.

En segundo lugar, los archivos DDS comprimidos en bloques suelen consumir más espacio en el disco que las imágenes JPEG comparables. Esto a su vez aumentará el tamaño del paquete de la aplicación y los requisitos de ancho de banda de red.

Uso de la compresión de bloques

En esta sección se explica cómo generar y usar recursos comprimidos en bloque en una aplicación direct2D.

Información general

Los archivos DDS comprimidos en bloques son un formato optimizado para tiempo de ejecución, lo que significa que están optimizados específicamente para un buen rendimiento en tiempo de ejecución de la aplicación. Se recomienda seguir usando la canalización de edición y creación de recursos existentes, y que solo se convierta en un formato comprimido en bloque al importarlos en el proyecto de aplicación o en tiempo de compilación.

Requisitos de DDS

El formato de archivo DDS se diseñó para admitir una amplia gama de características usadas en Direct3D. Direct2D solo usa un subconjunto de estas características. Por lo tanto, al crear imágenes DDS para su uso con Direct2D, debe tener en cuenta las siguientes restricciones:

  • Solo se permiten los siguientes valores de DXGI_FORMAT :
    • DXGI_FORMAT_BC1_UNORM
    • DXGI_FORMAT_BC2_UNORM
    • DXGI_FORMAT_BC3_UNORM
  • Se deben usar datos alfa premultiplicados. Esto incluye archivos DDS heredados que usan formatos que definen explícitamente alfa premultiplicado (DXT1, DXT2, DXT4), así como archivos DDS que usan la estructura de DDS_HEADER_DX10 con los valores de DDS_ALPHA_MODE_OPAQUE y DDS_ALPHA_MODE_PREMULTIPLIED.
  • Las dimensiones X e Y deben ser múltiplo de 4 píxeles.
  • No se permiten texturas de volumen, mapas de cubos, mapas mip ni matrices de texturas. Solo debe usar imágenes de origen de fotograma único.

Generación de recursos comprimidos en bloques

Hay una variedad de herramientas de creación de DDS disponibles para crear o convertir archivos DDS comprimidos en bloques. Tenga en cuenta que no todas las herramientas admiten los requisitos para usar archivos DDS con Direct2D, como se detalla en la sección anterior.

A partir de Visual Studio 2013, puede hacer que Visual Studio convierta los activos visuales existentes, como JPEG y PNG, al formato comprimido de bloque DDS correcto como parte automática del proceso de compilación. Esto se logra mediante el paso de compilación personalizado Tarea de contenido de imagen.

Para obtener información sobre cómo configurar esto para el proyecto, vea : Cómo: Exportar una textura para su uso con Aplicaciones Direct2D o Javascipt.

API de Direct2D

Direct2D se actualiza en Windows 8.1 para admitir los siguientes formatos de píxeles:

  • DXGI_FORMAT_BC1_UNORM
  • DXGI_FORMAT_BC2_UNORM
  • DXGI_FORMAT_BC3_UNORM

Para los formatos anteriores, debe usar alfa premultiplicado. Además, estos formatos solo son válidos para su uso como origen, no como destino. Por ejemplo, esto significa que puedes crear un mapa de bits de Direct2D con BC1, pero no un contexto de dispositivo.

Los métodos siguientes se actualizan en Windows 8.1 para admitir formatos BC:

Tenga en cuenta que CreateBitmapFromWicBitmap toma IWICBitmapSource como interfaz; sin embargo, en Windows 8.1 WIC no admite la obtención de datos comprimidos de bloques de IWICBitmapSource, y no hay ningún formato de píxel WIC correspondiente a DXGI_FORMAT_BC1_UNORM, etc. En su lugar, CreateBitmapFromWicBitmap determina si IWICBitmapSource es un DDS IWICBitmapFrameDecode válido y carga directamente los datos comprimidos en bloques. Puedes especificar explícitamente el formato de píxel en la estructura D2D1_BITMAP_PROPERTIES1 o permitir que Direct2D determine automáticamente el formato correcto.

API de componentes de imágenes de Windows

El componente de creación de imágenes de Windows (WIC) agrega un nuevo códec DDS en Windows 8.1. Además, agrega nuevas interfaces que admiten el acceso a datos específicos de DDS, incluidos los datos de píxeles comprimidos en bloques:

Bloquear formatos de píxeles WIC comprimidos

No hay nuevos formatos de píxeles comprimidos de bloque WIC en Windows 8.1. En su lugar, si obtiene un IWICBitmapFrameDecode del descodificador DDS y llama a CopyPixels, recibirá píxeles sin comprimir estándar, como WICPixelFormat32bppPBGRA. Puede usar IWICDdsFrameDecode::CopyBlocks para obtener los datos comprimidos de bloque sin procesar en forma de búfer de memoria de un archivo DDS.

Acceso de DDS de varios fotogramas

El formato de archivo DDS permite almacenar varias imágenes relacionadas en un único archivo. Por ejemplo, un archivo DDS puede contener un mapa de cubos, una textura de volumen o una matriz de texturas, todos los cuales pueden ser mipmapped. En Direct3D, estas varias imágenes se exponen como subrecursos. En WIC, varias imágenes se exponen como fotogramas (IWICBitmapFrameDecode e IWICBitmapFrameEncode).

WIC solo admite la noción de una matriz unidimensional de fotogramas, mientras que DDS admite tres dimensiones independientes (aunque solo dos se pueden usar en cualquier archivo). WIC proporciona métodos útiles para ayudar con la asignación entre un subrecurso DDS y un marco WIC. Para la descodificación, IWICDdsDecoder::GetFrame permite especificar el índice de matriz, el nivel mip y el índice de segmento del subrecurso y devuelve el marco WIC correcto.

Para la codificación, IWICDdsEncoder::CreateNewFrame calcula el índice de matriz resultante, el nivel mip y el índice de segmento al crear un nuevo marco. Primero debe haber llamado a IWICDdsEncoder::SetParameters para definir los parámetros de archivo específicos de DDS.

Cómo: Exportar una textura para usarla con aplicaciones de Direct2D o Javascript

Referencia de DDS

Compresión de bloques