Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A partir do Windows 8.1, o Direct2D suporta vários formatos de pixel comprimido em bloco. Além disso, o Windows 8.1 contém um novo codec DDS do Windows Imaging Component (WIC) para permitir o carregamento e armazenamento de imagens compactadas em bloco no formato de arquivo DDS. A compactação de bloco é uma técnica para reduzir a quantidade de memória gráfica consumida pelo conteúdo de bitmap. Usando a compactação de bloco, seu aplicativo pode reduzir o consumo de memória e os tempos de carregamento para as mesmas imagens de resolução. Ou, seu aplicativo pode usar mais ou imagens de resolução mais alta enquanto ainda consome o mesmo espaço de memória da GPU.
A compactação de blocos tem sido usada por aplicativos Direct3D há muito tempo, e com o Windows 8.1 também está disponível para desenvolvedores de aplicativos Direct2D e convencionais.
Este tópico descreve como a compactação de bloco funciona e como usá-la em WIC e Direct2D.
Sobre a compactação de blocos
Block Compression (BC) refere-se a uma classe de técnicas de compressão para reduzir tamanhos de textura. O Direct3D 11 suporta até 7 formatos BC diferentes, dependendo do nível de funcionalidade. No Windows 8.1, o Direct2D introduz suporte para os formatos BC1, BC2 e BC3 que estão disponíveis em todos os níveis de recursos.
Como funciona a compactação de blocos
Todos os formatos compactados em bloco usam a mesma técnica básica para reduzir o espaço consumido pelos dados coloridos. Esta seção resume o algoritmo mais simples, BC1. Para obter uma explicação mais detalhada, consulte Block Compression.
Primeiro, a imagem é dividida em blocos de 4 por 4 pixels. Cada bloco é comprimido separadamente.
Observação
Isso significa que a largura e a altura de uma imagem devem ser, cada uma, um múltiplo de 4 pixels para que ela seja compactada em bloco.
Esta imagem de exemplo mostra um bloco de pixels 4x4 dentro de uma imagem.
Em seguida, dentro de um bloco 4 por 4, duas cores de "referência" são selecionadas e codificadas como dois valores de 16 bits (5 bits vermelho, 6 bits verde, 5 bits azul). A escolha dessas cores afeta significativamente a qualidade da imagem e não é trivial. Duas cores intermediárias são calculadas interpolando linearmente entre as duas cores de referência no espaço de cores RGB. Isto produz um total de 4 cores diferentes possíveis; A cada cor é atribuído um valor de índice de dois bits. No entanto, observe que apenas as duas cores de ponto de extremidade precisam ser armazenadas à medida que a interpolação é fixa.
Nesta figura, as cores 0 e 3 são selecionadas como cores de "referência" para o bloco, enquanto as cores 1 e 2 são calculadas usando interpolação linear.
Finalmente, cada pixel no bloco é mapeado para uma das quatro cores calculadas anteriormente, e cada pixel é codificado usando o valor de índice de dois bits.
A quantidade total de dados usados para representar esses 16 pixels é:
16 bits [to define a reference color] * 2 + 2 bits * 16 [number of pixels] = 64 bits
Isso resulta em uma densidade média de 4 bits por pixel. Para comparação, o formato de pixel DXGI_FORMAT_B8G8R8A8_UNORM comum consome 32 bits por pixel.
Este diagrama mostra que cada pixel é codificado como um índice de 2 bits. Todo o bloco é codificado em 64 bits.
Existem variações para suportar dados alfa e números variáveis de canais de cor. BC6H e BC7 usam algoritmos significativamente diferentes para suportar conteúdo de alta faixa dinâmica (HDR) e aumentar a qualidade da imagem, respectivamente.
Formato de ficheiro DirectDraw Surface (DDS)
Os dados compactados de bloco normalmente são armazenados em arquivos de do DirectDraw Surface (DDS). Você pode estar familiarizado com arquivos DDS se for um desenvolvedor Direct3D. Observe que o Direct2D suporta apenas determinados recursos DDS; para obter mais informações, consulte Requisitos do DDS.
Vantagens da compressão de blocos
Os formatos compactados em bloco diferem dos formatos comuns de compactação de imagem do setor, como JPEG, pois os formatos BC são suportados nativamente pelas GPUs modernas. Isso significa que você pode carregar diretamente uma imagem compactada em bloco na GPU sem qualquer decodificação ou descompressão. Os formatos BC consomem de 4 a 8 bits por pixel, em média; quando comparado a um típico bitmap BGRA de 32 bits por pixel não compactado, isso resulta em economia de memória de 75% a 87,5%. Além disso, como não há nenhuma etapa de decodificação, o tempo para carregar uma imagem BC é significativamente reduzido em comparação com formatos como JPEG.
Quando usar a compactação de bloco
Você deve considerar o uso de imagens compactadas em bloco em seu aplicativo em vez de outros formatos, como JPEG, se quiser reduzir o consumo de memória de bitmaps ou reduzir os tempos de decodificação e carregamento.
No entanto, a compactação de bloco não é apropriada para todos os casos e requer algumas compensações. Primeiro, os algoritmos de compressão de bloco são com perdas. A compactação de blocos funciona bem com conteúdo fotográfico natural, mas pode introduzir artefatos visuais indesejados em imagens com limites nítidos e de alto contraste, como capturas de tela geradas por computador. Você deve garantir que seus ativos de imagem compactados em bloco tenham uma qualidade de imagem aceitável antes de usá-los.
Em segundo lugar, os arquivos DDS compactados em bloco geralmente consomem mais espaço no disco do que imagens JPEG comparáveis. Isso, por sua vez, aumentará o tamanho do pacote do seu aplicativo e os requisitos de largura de banda de rede.
Usando a compactação de bloco
Esta seção explica como gerar e usar ativos compactados em bloco em um aplicativo Direct2D.
Visão geral
Os arquivos DDS compactados em bloco são um formato otimizado para tempo de execução, o que significa que eles são especificamente otimizados para um bom desempenho no tempo de execução do aplicativo. Recomendamos que você continue a usar seu pipeline de criação e edição de ativos existente e só converta para um formato compactado em bloco quando importá-los para seu projeto de aplicativo ou em tempo de compilação.
Requisitos do DDS
O formato de arquivo DDS foi projetado para suportar uma ampla gama de recursos usados no Direct3D. O Direct2D usa apenas um subconjunto desses recursos. Portanto, ao criar imagens DDS para uso com Direct2D, você deve ter em mente as seguintes restrições:
- Só são permitidos os seguintes valores DXGI_FORMAT:
- DXGI_FORMAT_BC1_UNORM
- DXGI_FORMAT_BC2_UNORM
- DXGI_FORMAT_BC3_UNORM
- Devem ser utilizados dados alfa pré-multiplicados. Isso inclui arquivos DDS herdados usando formatos que definem explicitamente alfa pré-multiplicado (DXT1, DXT2, DXT4), bem como arquivos DDS que usam a estrutura DDS_HEADER_DX10 com os valores DDS_ALPHA_MODE_OPAQUE e DDS_ALPHA_MODE_PREMULTIPLIED.
- As dimensões X e Y devem ser múltiplas de 4 pixels.
- Texturas de volume, cubemaps, mipmaps ou matrizes de textura não são permitidos. Você só deve usar imagens de origem de quadro único.
Geração de ativos compactados em bloco
Há uma variedade de ferramentas de autoria DDS disponíveis para criar ou converter arquivos DDS compactados em bloco. Observação Nem todas as ferramentas suportam os requisitos para usar arquivos DDS com Direct2D, conforme detalhado na seção anterior.
A partir do Visual Studio 2013, você pode fazer com que o Visual Studio converta ativos visuais existentes, como JPEG e PNG, para o formato compactado de bloco DDS correto como parte automática do seu processo de compilação. Isso é feito usando a etapa de compilação personalizada Image Content Task.
Para obter informações sobre como configurar isso para seu projeto, consulte: Como: Exportar uma textura para uso com aplicativos Direct2D ou JavaScript.
Direct2D APIs
O Direct2D é atualizado no Windows 8.1 para suportar os seguintes formatos de pixel:
- DXGI_FORMAT_BC1_UNORM
- DXGI_FORMAT_BC2_UNORM
- DXGI_FORMAT_BC3_UNORM
Para os formatos anteriores, você deve usar alfa pré-multiplicado. Além disso, esses formatos são válidos apenas para uso como fonte, não como destino. Por exemplo, isso significa que você pode criar um bitmap Direct2D usando BC1, mas não um contexto de dispositivo.
Os seguintes métodos são atualizados no Windows 8.1 para oferecer suporte a formatos BC:
- ID2D1DeviceContext::IsDxgiFormatSupported
- ID2D1DeviceContext::CreateBitmap
- ID2D1DeviceContext::CreateBitmapFromDxgiSurface
- ID2D1RenderTarget::CreateSharedBitmap
- ID2D1RenderTarget::CreateBitmapFromWicBitmap
- ID2D1Bitmap::CopyFromMemory
- ID2D1Bitmap::CopyFromBitmap
- ID2D1Bitmap1::GetSurface
Observe que CreateBitmapFromWicBitmap usa IWICBitmapSource como uma interface; no entanto, no Windows 8.1, o WIC não suporta a obtenção de dados compactados em bloco de IWICBitmapSource e não há nenhum formato de pixel WIC correspondente a DXGI_FORMAT_BC1_UNORM, etc. Em vez disso, CreateBitmapFromWicBitmap determina se o IWICBitmapSource é umDDS válidoIWICBitmapFrameDecode e carrega diretamente os dados compactados do bloco. Você pode especificar explicitamente o formato de pixel na estrutura D2D1_BITMAP_PROPERTIES1 ou permitir que o Direct2D determine automaticamente o formato correto.
Windows Imaging Component APIs
O Windows Imaging Component (WIC) adiciona um novo codec DDS no Windows 8.1. Além disso, adiciona novas interfaces que suportam o acesso a dados específicos de DDS, incluindo dados de pixel compactados em bloco:
- IWICDdsDecoder
- IWICDdsEncoder
- IWICDdsFrameDecode
Bloquear formatos de pixel WIC compactado
Não existem novos formatos de píxeis comprimidos em bloco WIC no Windows 8.1. Em vez disso, se você obtiver um IWICBitmapFrameDecode do decodificador DDS e chamar CopyPixels, você receberá pixels não compactados padrão, como WICPixelFormat32bppPBGRA. Você pode usar IWICDdsFrameDecode::CopyBlocks para obter os dados compactados de bloco bruto na forma de um buffer de memória de um arquivo DDS.
Acesso DDS multi-frame
O formato de arquivo DDS permite que várias imagens relacionadas sejam armazenadas em um único arquivo. Por exemplo, um arquivo DDS pode conter um cubemap, textura de volume ou matriz de textura, todos os quais podem ser mapeados. No Direct3D, essas várias imagens são expostas como subrecursos. No WIC, várias imagens são expostas como quadros (IWICBitmapFrameDecode e IWICBitmapFrameEncode).
O WIC suporta apenas a noção de uma matriz unidimensional de quadros, enquanto o DDS suporta três dimensões independentes (embora apenas duas possam ser usadas em qualquer arquivo). O WIC fornece métodos de conveniência para ajudar no mapeamento entre um subrecurso DDS e um quadro WIC. Para decodificação, IWICDdsDecoder::GetFrame permite especificar o índice da matriz, o nível de mip e o índice de fatia do subrecurso e retorna o quadro WIC correto.
Para codificação, IWICDdsEncoder::CreateNewFrame calcula o índice de matriz resultante, o nível de mip e o índice de fatia quando você cria um novo quadro. Você deve ter chamado primeiro IWICDdsEncoder::SetParameters para definir os parâmetros de arquivo específicos do DDS.
Tópicos relacionados