Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Начиная с 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 в изображении.
Затем в пределах 4-4 блока выбираются два "ссылочных" цвета и кодируются как два 16-разрядных значений (5 бит красных, 6 бит зеленых, 5 бит синего). Выбор этих цветов значительно влияет на качество изображения и является нетривиальным. Два промежуточных цвета вычисляются путем линейной интерполяции между двумя ссылочными цветами в цветовом пространстве RGB. Это создает в общей сложности 4 различных возможных цвета; каждому цвету присваивается двух битовое значение индекса. Однако обратите внимание, что необходимо сохранить только два цвета конечной точки, так как интерполяция исправлена.
На этом рисунке цвета 0 и 3 выбираются в качестве ссылочных цветов для блока, а цвета 1 и 2 вычисляются с помощью линейной интерполяции.
Наконец, каждый пиксель в блоке сопоставляется с одним из четырех ранее вычисляемых цветов, и каждый пиксель закодирован с помощью двух битового значения индекса.
Общий объем данных, используемых для представления этих 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 битах.
Существуют варианты для поддержки альфа-данных и различных номеров цветовых каналов. 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:
- ID2D1DeviceContext::IsDxgiFormatSupported
- ID2D1DeviceContext::CreateBitmap
- ID2D1DeviceContext::CreateBitmapFromDxgiSurface
- ID2D1RenderTarget::CreateSharedBitmap
- ID2D1RenderTarget::CreateBitmapFromWicBitmap
- ID2D1Bitmap::CopyFromMemory
- ID2D1Bitmap::CopyFromBitmap
- ID2D1Bitmap1::GetSurface
Обратите внимание, что 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 .
Связанные темы