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


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

Начиная с 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, можно преобразовать существующие визуальные ресурсы, такие как 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 вы получите стандартные несжатые пиксели, такие как WICPixelFormat32bppPGRA. С помощью 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

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