Поделиться через


Сжатие блоков

Начиная с Windows 8.1, Direct2D поддерживает несколько форматов пикселей со сжатием блоков. Кроме того, Windows 8.1 содержит новый кодек DDS компонента образов Windows (WIC) для загрузки и хранения блочных сжатых изображений в формате файла DDS. Сжатие блоков — это способ уменьшения объема графической памяти, потребляемой содержимым растрового изображения. С помощью блочного сжатия приложение может сократить потребление памяти и время загрузки для изображений с тем же разрешением. Кроме того, ваше приложение может использовать изображения с большим или высоким разрешением, сохраняя при этом тот же объем памяти GPU.

Сжатие блоков используется приложениями Direct3D в течение длительного времени, а с Windows 8.1 доступно для основных разработчиков приложений и приложений Direct2D.

В этом разделе описывается, как работает сжатие блоков и как его использовать в WIC и Direct2D.

Сведения о сжатии блоков

Блочное сжатие (BC) относится к классу методов сжатия для уменьшения размеров текстуры. Direct3D 11 поддерживает до 7 различных форматов BC в зависимости от уровня компонентов. В Windows 8.1 Direct2D предоставляет поддержку форматов BC1, BC2 и BC3, доступных на всех уровнях функций.

Принцип работы блочного сжатия

Форматы, сжатые блоками, используют один и тот же базовый метод для уменьшения пространства, занятого цветными данными. В этом разделе приводится сводка по простейшему алгоритму BC1. Более подробное описание см. в разделе Сжатие блоков.

Во-первых, изображение делится на блоки по 4 на 4 пикселя. Каждый блок сжимается отдельно.

Примечание

Это означает, что ширина и высота каждого изображения должны быть кратными 4 пикселя для сжатия блока.

 

На этом изображении показан блок 4x4 пикселей в изображении.

На примере изображения показан блок 4x4 пикселей внутри изображения.

Затем в блоке 4 на 4 выбираются два "ссылочных" цвета и кодируются в виде двух 16-разрядных значений (5 битов красного, 6 битов зеленого, 5 битов синего). Выбор этих цветов значительно влияет на качество изображения и является нетривиальным. Два промежуточных цвета вычисляются путем линейной интерполяции между двумя эталонными цветами в цветовом пространстве RGB. Это создает в общей сложности 4 различных возможных цветов; каждому цвету присваивается значение двух битового индекса. Однако обратите внимание, что по мере исправления интерполяции необходимо сохранить только два цвета конечных точек.

На этом рисунке цвета 0 и 3 выбраны в качестве эталонных цветов для блока, а цвета 1 и 2 вычисляются с помощью линейной интерполяции.

Схема, на которую показано вычисление 4 значений цвета для представления блока.

Наконец, каждый пиксель в блоке сопоставляется с одним из четырех ранее вычисляемых цветов, и каждый пиксель кодируется с использованием двух битового значения индекса.

Общий объем данных, используемых для представления этих 16 пикселей, составляет:

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

Это приводит к средней плотности 4 бита на пиксель. Для сравнения, общий формат DXGI_FORMAT_B8G8R8A8_UNORM пикселей потребляет 32 бита на пиксель.

На этой схеме показано, что каждый пиксель закодирован как 2-разрядный индекс. Весь блок закодирован в 64 бита.

вычисляет 4 значения цвета для представления блока.

Существуют варианты поддержки альфа-данных и разное количество цветовых каналов. BC6H и BC7 используют значительно разные алгоритмы для поддержки содержимого с высоким динамическим диапазоном (HDR) и повышения качества изображения соответственно.

Формат файла DirectDraw Surface (DDS)

Блочные сжатые данные обычно хранятся в файлах DirectDraw Surface (DDS). Вы можете быть знакомы с файлами DDS, если вы являетесь разработчиком Direct3D. Обратите внимание, что Direct2D поддерживает только определенные функции DDS. Дополнительные сведения см. в разделе Требования К DDS.

Преимущества сжатия блоков

Форматы сжатия блоков отличаются от распространенных отраслевых форматов сжатия изображений, таких как JPEG, тем, что форматы BC изначально поддерживаются современными GPU. Это означает, что вы можете напрямую загрузить блочное сжатое изображение на GPU без декодирования или распаковки. Форматы BC потребляют от 4 до 8 бит на пиксель в среднем; по сравнению с типичным несжатой 32-разрядной растровой картой BGRA пикселя это приводит к экономии памяти от 75 % до 87,5 %. Кроме того, поскольку шаг декодирования отсутствует, время загрузки изображения BC значительно сокращается по сравнению с такими форматами, как JPEG.

Когда следует использовать блочное сжатие

Рекомендуется использовать блочные сжатые изображения в приложении вместо других форматов, таких как JPEG, если вы хотите уменьшить потребление памяти растровыми изображениями или сократить время декодирования и загрузки.

Однако сжатие блоков подходит не для всех случаев и требует некоторых компромиссов. Во-первых, алгоритмы сжатия блоков являются потерями. Блочное сжатие хорошо работает с естественным фотографическим содержимым, но может ввести нежелательные визуальные артефакты на изображения с четкими границами высокой контрастности, например снимки экрана, созданные компьютером. Перед использованием следует убедиться, что ресурсы изображений, сжатые блоком, имеют приемлемое качество изображения.

Во-вторых, блочные сжатые DDS-файлы обычно занимают больше места на диске, чем сопоставимые изображения JPEG. Это, в свою очередь, увеличит размер пакета приложения и требования к пропускной способности сети.

Использование блочного сжатия

В этом разделе объясняется, как создавать и использовать блочные сжатые ресурсы в приложении Direct2D.

Общие сведения

Блочные сжатые DDS-файлы — это формат, оптимизированный для среды выполнения. Это означает, что они специально оптимизированы для обеспечения высокой производительности во время выполнения приложения. Рекомендуется продолжать использовать существующий конвейер создания и редактирования ресурсов и преобразовывать их в сжатый блочный формат только при импорте в проект приложения или во время сборки.

Требования DDS

Формат файлов DDS был разработан для поддержки широкого спектра функций, используемых в Direct3D. Direct2D использует только подмножество этих функций. Поэтому при создании образов DDS для использования с Direct2D необходимо учитывать следующие ограничения:

  • Допустимы только следующие DXGI_FORMAT значения:
    • DXGI_FORMAT_BC1_UNORM
    • DXGI_FORMAT_BC2_UNORM
    • DXGI_FORMAT_BC3_UNORM
  • Необходимо использовать предварительно подготовленные альфа-данные. Сюда входят устаревшие файлы DDS, использующие форматы, которые явно определяют предварительно заданный альфа-канал (DXT1, DXT2, DXT4), а также файлы DDS, использующие структуру DDS_HEADER_DX10 со значениями DDS_ALPHA_MODE_OPAQUE и DDS_ALPHA_MODE_PREMULTIPLIED.
  • Размеры X и Y должны быть кратными 4 пикселям.
  • Текстуры томов, кубовые карты, MIP-карты или массивы текстур запрещены. Следует использовать только однокадровое исходное изображение.

Создание блочных сжатых ресурсов

Существует множество средств разработки DDS для создания или преобразования блочных сжатых файлов DDS. Обратите внимание, что не все средства поддерживают требования к использованию DDS-файлов с Direct2D, как описано в предыдущем разделе.

Начиная с Visual Studio 2013, visual Studio может автоматически преобразовывать существующие визуальные ресурсы, такие как JPEG и PNG, в правильный формат, сжатый блоком DDS. Это достигается с помощью настраиваемого шага сборки задачи содержимого изображения.

Сведения о том, как настроить эту функцию для проекта, см. в статье Практическое руководство. Экспорт текстуры для использования с Приложениями Direct2D или Javascipt.

API Direct2D

Direct2D обновлен в Windows 8.1 для поддержки следующих форматов пикселей:

  • DXGI_FORMAT_BC1_UNORM
  • DXGI_FORMAT_BC2_UNORM
  • DXGI_FORMAT_BC3_UNORM

Для предыдущих форматов необходимо использовать предварительно замедленный альфа-канал. Кроме того, эти форматы допустимы только для использования в качестве источника, а не целевого объекта. Например, это означает, что можно создать точечный рисунок Direct2D с помощью BC1, но не контекста устройства.

Следующие методы обновлены в Windows 8.1 для поддержки форматов BC:

Обратите внимание, что CreateBitmapFromWicBitmap принимает IWICBitmapSource в качестве интерфейса; однако в Windows 8.1 WIC не поддерживает получение блочных сжатых данных из IWICBitmapSource, а также отсутствует формат пикселей WIC, соответствующий DXGI_FORMAT_BC1_UNORM и т. д. Вместо этого CreateBitmapFromWicBitmap определяет, является ли IWICBitmapSource допустимым DDS IWICBitmapFrameDecode, и напрямую загружает сжатые блочные данные. Можно либо явно указать формат пикселей в структуре D2D1_BITMAP_PROPERTIES1 , либо разрешить Direct2D автоматически определять правильный формат.

API-интерфейсы компонентов обработки образов Windows

Компонент обработки образов Windows (WIC) добавляет новый кодек DDS в Windows 8.1. Кроме того, он добавляет новые интерфейсы, поддерживающие доступ к данным, зависящим от DDS, включая блочные сжатые пиксельные данные:

Блочные сжатые форматы пикселей WIC

В Windows 8.1 нет новых форматов пикселей, сжатых с блоком WIC. Вместо этого, если получить IWICBitmapFrameDecode из декодера DDS и вызвать CopyPixels, вы получите стандартные несжатые пиксели, такие как WICPixelFormat32bppPBGRA. IWICDdsFrameDecode::CopyBlocks можно использовать для получения необработанных данных, сжатых блоками, в виде буфера памяти из DDS-файла.

Многокадровый доступ к DDS

Формат файла DDS позволяет хранить несколько связанных изображений в одном файле. Например, файл DDS может содержать кубиную карту, текстуру тома или массив текстур, все из которых можно использовать mipmapped. В Direct3D эти несколько образов предоставляются в виде подресурсов. В WIC несколько изображений предоставляются в виде кадров (IWICBitmapFrameDecode и IWICBitmapFrameEncode).

WIC поддерживает только одномерный массив кадров, тогда как DDS поддерживает три независимых измерения (хотя только два могут использоваться в одном файле). WIC предоставляет удобные методы для сопоставления между подресурсом DDS и кадром WIC. Для декодирования IWICDdsDecoder::GetFrame позволяет указать индекс массива, уровень MIP и индекс среза подресурса, а также возвращает правильный кадр WIC.

Для кодирования IWICDdsEncoder::CreateNewFrame вычисляет результирующий индекс массива, уровень MIP и индекс среза при создании нового кадра. Для определения параметров файла DDS необходимо сначала вызвать IWICDdsEncoder::SetParameters .

Практическое руководство. Экспорт текстуры для использования с приложениями Direct2D или Javascipt

Справочник по DDS

Сжатие блоков