Condividi tramite


Compressione a blocchi

A partire da Windows 8.1, Direct2D supporta diversi formati di pixel compressi a blocchi. Inoltre, Windows 8.1 contiene un nuovo codec DDS (Windows Imaging Component) per abilitare il caricamento e l'archiviazione di immagini compresshe in blocchi nel formato di file DDS. La compressione dei blocchi è una tecnica per ridurre la quantità di memoria grafica utilizzata dal contenuto bitmap. Usando la compressione dei blocchi, l'app può ridurre il consumo di memoria e i tempi di caricamento per le stesse immagini di risoluzione. In alternativa, l'app può usare immagini di risoluzione più o superiori mentre utilizzano lo stesso footprint di memoria GPU.

La compressione dei blocchi è stata usata dalle applicazioni Direct3D per molto tempo e con Windows 8.1 è disponibile anche per sviluppatori di applicazioni mainstream e Direct2D.

Questo argomento descrive come funziona la compressione dei blocchi e come usarlo in WIC e Direct2D.

Informazioni sulla compressione dei blocchi

La compressione dei blocchi (BC) fa riferimento a una classe di tecniche di compressione per ridurre le dimensioni della trama. Direct3D 11 supporta fino a 7 formati BC diversi a seconda del livello di funzionalità. In Windows 8.1 Direct2D introduce il supporto per i formati BC1, BC2 e BC3 disponibili in tutti i livelli di funzionalità.

Funzionamento della compressione dei blocchi

I formati compressi in blocchi usano la stessa tecnica di base per ridurre lo spazio utilizzato dai dati dei colori. Questa sezione riepiloga l'algoritmo più semplice, BC1. Per una spiegazione più dettagliata, vedere Compressione blocchi.

Prima di tutto, l'immagine è divisa in blocchi di 4 per 4 pixel. Ogni blocco viene compresso separatamente.

Nota

Ciò significa che la larghezza e l'altezza di un'immagine devono essere un multiplo di 4 pixel per il blocco compresso.

 

Questa immagine di esempio mostra un blocco di pixel 4x4 all'interno di un'immagine.

un'immagine di esempio mostra un blocco di pixel 4x4 all'interno di un'immagine.

Successivamente, all'interno di un blocco da 4 a 4, vengono selezionati due colori "riferimento" e vengono codificati come due valori a 16 bit (5 bit rossi, 6 bit verdi, 5 bit blu). La scelta di questi colori influisce significativamente sulla qualità dell'immagine ed è nontriviale. Due colori intermedi vengono calcolati interpolando in modo lineare tra i due colori di riferimento nello spazio dei colori RGB. Questo produce un totale di 4 diversi colori possibili; ogni colore viene assegnato un valore di indice a due bit. Si noti tuttavia che solo i due colori dell'endpoint devono essere archiviati perché l'interpolazione è fissa.

In questa figura i colori 0 e 3 vengono selezionati come colori di riferimento per il blocco, mentre i colori 1 e 2 vengono calcolati usando l'interpolazione lineare.

Diagramma che mostra il calcolo di 4 valori di colore per rappresentare il blocco.

Infine, ogni pixel del blocco viene mappato a uno dei quattro colori calcolati in precedenza e ogni pixel viene codificato usando il valore dell'indice a due bit.

La quantità totale di dati usati per rappresentare questi 16 pixel è:

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

Ciò comporta una densità media di 4 bit per pixel. Per confronto, il formato di pixel di DXGI_FORMAT_B8G8R8A8_UNORM comune usa 32 bit per pixel.

Questo diagramma mostra che ogni pixel viene codificato come indice a 2 bit. L'intero blocco viene codificato in 64 bit.

calcolo di 4 valori di colore per rappresentare il blocco.

Esistono varianti per supportare i dati alfa e diversi numeri di canali di colore. BC6H e BC7 usano algoritmi significativamente diversi per supportare il contenuto HDR (High Dynamic Range) e aumentare rispettivamente la qualità dell'immagine.

Formato di file DDS (DirectDraw Surface)

I dati compressi bloccati vengono in genere archiviati nei file DDS (DirectDraw Surface). È possibile avere familiarità con i file DDS se si è uno sviluppatore Direct3D. Si noti che Direct2D supporta solo determinate funzionalità DDS; per altre informazioni, vedere Requisiti DDS.

Vantaggi della compressione dei blocchi

I formati compressi in blocchi differiscono dai formati comuni di compressione delle immagini del settore, ad esempio JPEG nei formati BC, sono supportati in modo nativo dalle GPU moderne. Ciò significa che è possibile caricare direttamente un'immagine compressa in blocco nella GPU senza decodificare o decompressione. I formati BC usano da 4 a 8 bit per pixel in media; se confrontato con una tipica bitmap BGRA a 32 bit non compressi, questo comporta un risparmio di memoria del 75% al 87,5%. Inoltre, poiché non esiste alcun passaggio di decodifica, il tempo per caricare un'immagine BC è notevolmente ridotto rispetto ai formati come JPEG.

Quando usare la compressione blocca

È consigliabile usare immagini compresse bloccate nell'app anziché altri formati, ad esempio JPEG, se si vuole ridurre il consumo di memoria delle bitmap o ridurre i tempi di decodifica e caricamento.

Tuttavia, la compressione dei blocchi non è appropriata per tutti i casi e richiede alcuni compromessi. Prima di tutto, gli algoritmi di compressione dei blocchi sono di perdita. La compressione dei blocchi funziona bene con contenuti fotografici naturali, ma può introdurre elementi visivi indesiderati in immagini con limiti a contrasto elevato e nitidi, ad esempio screenshot generati dal computer. Prima di usarli, è necessario assicurarsi che gli asset di immagine compressi bloccati abbiano una qualità di immagine accettabile.

In secondo luogo, bloccare i file DDS compressi in genere utilizzano più spazio sul disco rispetto alle immagini JPEG paragonabili. Ciò a sua volta aumenterà le dimensioni del pacchetto e i requisiti di larghezza di banda di rete dell'app.

Uso della compressione dei blocchi

Questa sezione illustra come generare e usare asset compressi bloccati in un'app Direct2D.

Panoramica

I file DDS compressi bloccati sono un formato ottimizzato per il runtime, ovvero sono ottimizzati in modo specifico per prestazioni ottimali in fase di esecuzione dell'app. È consigliabile continuare a usare la pipeline di creazione e modifica dell'asset esistente e convertire in un formato compresso a blocchi solo quando si importano nel progetto dell'applicazione o in fase di compilazione.

Requisiti DDS

Il formato di file DDS è stato progettato per supportare un'ampia gamma di funzionalità usate in Direct3D. Direct2D usa solo un subset di queste funzionalità. Pertanto, quando si creano immagini DDS da usare con Direct2D, è necessario tenere presente le restrizioni seguenti:

  • Sono consentiti solo i valori di DXGI_FORMAT seguenti:
    • DXGI_FORMAT_BC1_UNORM
    • DXGI_FORMAT_BC2_UNORM
    • DXGI_FORMAT_BC3_UNORM
  • I dati alfa premultiplied devono essere usati. Sono inclusi i file DDS legacy che usano formati che definiscono in modo esplicito alfa premultiplied (DXT1, DXT2, DXT4), nonché file DDS che usano la struttura DDS_HEADER_DX10 con i valori di DDS_ALPHA_MODE_OPAQUE e DDS_ALPHA_MODE_PREMULTIPLIED.
  • Le dimensioni X e Y devono essere multiple di 4 pixel.
  • Le trame del volume, le mappe cubi, le mappe mipmap o le matrici di trame non sono consentite. È consigliabile usare solo immagini di origine frame singolo.

Generazione di asset compressi bloccati

Esistono diversi strumenti di creazione DDS disponibili per creare o convertire file DDS compressi in blocchi. Nota non tutti gli strumenti supportano i requisiti per l'uso di file DDS con Direct2D, come illustrato nella sezione precedente.

A partire da Visual Studio 2013, è possibile convertire gli asset visivi esistenti come JPEG e PNG nel formato compresso DDS corretto come parte automatica del processo di compilazione. Questa operazione viene eseguita usando il passaggio di compilazione personalizzato dell'attività contenuto immagine.

Per informazioni su come configurare questa funzionalità per il progetto, vedere Procedura: Esportare una trama per l'uso con Direct2D o Javascipt Apps.

API Direct2D

Direct2D viene aggiornato in Windows 8.1 per supportare i formati pixel seguenti:

  • DXGI_FORMAT_BC1_UNORM
  • DXGI_FORMAT_BC2_UNORM
  • DXGI_FORMAT_BC3_UNORM

Per i formati precedenti, è necessario usare alfa premultiplied. Inoltre, questi formati sono validi solo per l'uso come origine, non come destinazione. Questo significa, ad esempio, che è possibile creare una bitmap Direct2D usando BC1, ma non un contesto del dispositivo.

I metodi seguenti vengono aggiornati in Windows 8.1 per supportare i formati BC:

Si noti che CreateBitmapFromWicBitmap accetta IWICBitmapSource come interfaccia; tuttavia, in Windows 8.1 WIC non supporta il recupero di dati compressi bloccati da IWICBitmapSource e non esiste alcun formato di pixel WIC corrispondente a DXGI_FORMAT_BC1_UNORM e così via. CreateBitmapFromWicBitmap determina invece se IWICBitmapSource è un DDS IWICBitmapFrameDecode valido e carica direttamente i dati compressi in blocco. È possibile specificare in modo esplicito il formato pixel nello struct D2D1_BITMAP_PROPERTIES1 o consentire a Direct2D di determinare automaticamente il formato corretto.

API del componente Windows Imaging

Windows Imaging Component (WIC) aggiunge un nuovo codec DDS in Windows 8.1. Aggiunge inoltre nuove interfacce che supportano l'accesso a dati specifici di DDS, inclusi i dati pixel compressi bloccati:

Blocca formati di pixel WIC compressi

In Windows 8.1 non sono presenti nuovi formati di pixel compressi bloccati wic. Se invece si ottiene un IWICBitmapFrameDecode dal decodificatore DDS e si chiama CopyPixels, si riceveranno pixel non compressi standard come WICPixelFormat32bppPGRA. È possibile usare IWICDdsFrameDecode::CopyBlocks per ottenere i dati compressi in blocchi non elaborati sotto forma di buffer di memoria da un file DDS.

Accesso DDS a più fotogrammi

Il formato di file DDS consente di archiviare più immagini correlate in un singolo file. Ad esempio, un file DDS può contenere una mappa cubo, una trama del volume o una matrice di trame, che può essere applicata in modo non corretta. In Direct3D queste più immagini vengono esposte come sottorisorse. In WIC più immagini vengono esposte come frame (IWICBitmapFrameDecode e IWICBitmapFrameEncode).

WIC supporta solo la nozione di una matrice unidimensionale di frame, mentre DDS supporta tre dimensioni indipendenti (anche se solo due possono essere usate in qualsiasi file). WIC offre metodi pratici per facilitare il mapping tra una sottorisorsa DDS e un frame WIC. Per la decodifica, IWICDdsDecoder::GetFrame consente di specificare l'indice della matrice, il livello mip e l'indice della sezione della sottorisorsa e restituisce il frame WIC corretto.

Per la codifica , IWICDdsEncoder::CreateNewFrame calcola l'indice della matrice risultante, il livello mip e l'indice della sezione quando si crea un nuovo frame. È necessario aver prima chiamato IWICDdsEncoder::SetParameters per definire i parametri di file specifici di DDS.

Procedura: Esportare una trama da usare con app Direct2D o Javascript

Informazioni di riferimento per DDS

Compressione a blocchi