Цветопередача и форматы данных - SIISII/DirectX GitHub Wiki
Обеспечение правильной цветопередачи
Чтобы корректно выполнять операции над цветами, выраженными вещественными числами, и для правильного формирования составного изображения на экране (т. е. изображения, формируемого из картинок, созданных разными приложениями) необходимо работать в корректном цветовом пространстве. Вещественные операции рекомендуется выполнять в линейном цветовом пространстве, а для выдачи сформированного кадра на экран преобразовывать данные в стандартное цветовое пространство sRGB (пространство, скорректированное для гаммы 2.2). Передача на отображение данных в sRGB важна для обеспечения точной цветопередачи. Если изображение не скорректировано для гаммы 2.2, оно будет выделять слишком много битов или полосы пропускания для ярких цветов, которые человек различить между собой уже не может, одновременно теряя биты или полосу для различимых приглушённых цветов.
Форматы данных
DirectX поддерживает большое количество форматов данных; соответствующие им константы определены в перечислении DXGI_FORMAT. Какие именно форматы поддерживаются, зависит от версии DirectX, поддерживаемой аппаратурой и опрационной системой (см. ниже).
Название формата перечисляет входящие в него компоненты, размер каждого компонента в битах и тип компонента, например: DXGI_FORMAT_R32G32B32A32_FLOAT
— четыре 32-разрядных компонента (R, G, B, A), каждый из которых является вещественным числом. Для обозначения типа данных в компоненте используются следующие суффиксы:
-
_FLOAT
— число с плавающей запятой. В случае 32-разрядных значений используется представление, соответствующее стандарту IEEE 754 (8 разрядов отведено под смещённый порядок, 23 разряда, не считая подразумеваемую старшую единицу, — под мантиссу). В случае 16-разрядных значений под смещённый порядок отведено 5 разрядов, под мантиссу — 10 разрядов. -
_SINT
— целое число со знаком в дополнительном коде. -
_SNORM
— нормализованное целое число со знаком: в ресурсе оно интерпретируется как обычное целое число в дополнительном коде, а для использования в шейдерах преобразуется в нормализованное вещественное число в диапазоне [–1.0; 1.0]. Для этого максимально возможное положительное целое значение преобразуется в вещественное значение +1.0, а два самых больших по модулю отрицательных целых — в вещественное значение –1.0. Например, для 8-битового целого числа со знаком самым большим положительным значением является 127, а двумя самыми большими отрицательными –128 и –127; фактически на диапазон вещественных чисел [–1.0; 1.0] равномерно отображаются целые числа в диапазоне [–127; 127]. -
_SRGB
— этот суффикс является дополнительным, указываемым после основного, задающего собственно формат данных с точки зрения машины. Он указывает, что представленные в нём данные соответствуют стандарту sRGB, что обеспечивает равномерный рост яркости цветов с точки зрения среднестатистического наблюдателя для среднестатистических условий наблюдения при отображении на среднестатистическом дисплее. Весь набор яркостей каждого цветового канала отображается на диапазон вещественных чисел [0.0; 1.0] нелинейным образом в соответствии со стандартом sRGB (IEC 61996-2-1).Преобразование в формат sRGB или из него выполняется автоматически методами загрузки текстур. Если формат пикселя содержит альфа-канал, при его преобразовании используется гамма 1.0, а при преобразовании цветовых каналов — гамма 2.2.
-
_TYPELESS
— значения определённого размера в битах, но без точного определения их типа. Точный тип должен определяться либо приложением, либо шейдером при привязке ресурса, содержащего такие данные, при этом количество битов изменяться не может. -
_UINT
— беззнаковое целое число. -
_UNORM
— нормализованное беззнаковое целое число, равномерно отображаемое на вещественное число в диапазоне [0.0; 1.0]. -
_SHAREDEXP
— вещественный формат с общим порядком (все вещественные числа, входящие в данный формат, имеют общий порядок).
Логический смысл каждого элемента компонента указывается буквой, за которой следует количество битов, отведённых под этот элемент:
R
— канал красного цвета;G
— канал зелёного цвета;B
— канал синего цвета;A
— канал прозрачности (альфа-канал);D
— глубина;S
— шаблон (stencil);X
— неиспользуемые разряды.
Заметим, что реальный способ использования компонентов формата может отличаться от формального. Например, вместо значений цветов в каналах RGB можно передавать координаты.
Если представить некоторый формат как массив компонентов, то первый из перечисленных компонентов будет элементом 0 массива, второй компонент, — элементом 1 и так далее. Если несколько компонентов помещаются в один машинный формат данных (например, в слово), первый из перечисленных компонентов будет размещаться в самых младших битах, второй — в следующих и так далее. Порядок следования битов в компоненте («старший-младший» или «младший-старший») в исходном тексте программы не учитывается, значения всегда записываются в «естественном» виде, например:
// DXGI_FORMAT_R32G32B32A32_FLOAT
float *pR32G32B32A32 = ...;
pR32G32B32A32[0] = 1.0f; // R
pR32G32B32A32[1] = 0.0f; // G
pR32G32B32A32[2] = 0.0f; // B
pR32G32B32A32[3] = 0.5f; // A
// DXGI_FORMAT_R10G10B10A2_UNORM
UINT32 *pR10G10B10A2 = ...;
pR10G10B10A2 = 0x3FF | (0x1 << 30); // R = 0x3FF, A = 0x1
Заметим, что, хотя обычно говорится о формате пикселей (или текстелей, т. е. пикселей, входящих в состав текстуры), фактический смысл данных определяется их использованием, поэтому корректней говорить о форматах данных, хранящихся в ресурсах.
Ряд описываемых здесь форматов соответствует определённым форматам DirectXMath.
Обозначения форматов данных и их характеристики
Если поддержка некоторого формата является необязательной, при наличии поддержки она не всегда является ускоренной аппаратно. Некоторые форматы являются обязательными лишь в случае, если реализована поддержка некоторых необязательных возможностей. Полную сводку возможности использования того или иного формата можно посмотреть здесь:
- для Direct3D 10;
- для Direct3D 10.1;
- для Direct3D 11;
- для Direct3D 11.1;
- для Direct3D 12;
- для Direct3D 12.1.
В Direct3D 11 и Direct3D 12 можно программно проверить наличие поддержки того или иного формата с помощью методов ID3D11Device::CheckFormatSupport и ID3D12Device::CheckFeatureSupport соответственно. В Direct3D 10 такой возможности нет, и здесь надо исходить из номера версии.
Форматы общего назначения
DXGI_FORMAT_UNKNOWN
— тип и размер данных неизвестен.DXGI_FORMAT_R32G32B32A32_TYPELESS
— 128 битов в элементе, логически состоящем из четырёх 32-разрядных компонентов неизвестного типа.DXGI_FORMAT_R32G32B32A32_FLOAT
— 128 битов в элементе, состоящем из четырёх 32-разрядных вещественных компонентов.DXGI_FORMAT_R32G32B32A32_UINT
— 128 битов в элементе, состоящем из четырёх 32-разрядных беззнаковых целых компонентов.DXGI_FORMAT_R32G32B32A32_SINT
— 128 битов в элементе, состоящем из четырёх 32-разрядных знаковых целых компонентов.DXGI_FORMAT_R32G32B32_TYPELESS
— 96 битов в элементе, логически состоящем из трёх 32-разрядных компонентов неизвестного типа.DXGI_FORMAT_R32G32B32_FLOAT
— 96 битов в элементе, логически состоящем из трёх 32-разрядных вещественных компонентов.DXGI_FORMAT_R32G32B32_UINT
— 96 битов в элементе, логически состоящем из трёх 32-разрядных беззнаковых целых компонентов.DXGI_FORMAT_R32G32B32_SINT
— 96 битов в элементе, логически состоящем из трёх 32-разрядных знаковых целых компонентов.DXGI_FORMAT_R16G16B16A16_TYPELESS
— 64 бита в элементе, логически состоящем из четырёх 16-разрядных компонентов неизвестного типа.DXGI_FORMAT_R16G16B16A16_FLOAT
— 64 бита в элементе, логически состоящем из четырёх 16-разрядных вещественных компонентов.DXGI_FORMAT_R16G16B16A16_UNORM
— 64 бита в элементе, логически состоящем из четырёх 16-разрядных нормализованных беззнаковых целых компонентов.DXGI_FORMAT_R16G16B16A16_UINT
— 64 бита в элементе, логически состоящем из четырёх 16-разрядных беззнаковых целых компонентов.DXGI_FORMAT_R16G16B16A16_SNORM
— 64 бита в элементе, логически состоящем из четырёх 16-разрядных нормализованных знаковых целых компонентов.DXGI_FORMAT_R16G16B16A16_SINT
— 64 бита в элементе, логически состоящем из четырёх 16-разрядных знаковых целых компонентов.DXGI_FORMAT_R32G32_TYPELESS
— 64 бита в элементе, логически состоящем из двух 32-разрядных компонентов неизвестного типа.DXGI_FORMAT_R32G32_FLOAT
— 64 бита в элементе, логически состоящем из двух 32-разрядных вещественных компонентов.DXGI_FORMAT_R32G32_UINT
— 64 бита в элементе, логически состоящем из двух 32-разрядных беззнаковых целых компонентов.DXGI_FORMAT_R32G32_SINT
— 64 бита в элементе, логически состоящем из двух 32-разрядных знаковых целых компонентов.DXGI_FORMAT_R32G8X24_TYPELESS
— 64 бита в элементе, логически состоящем из одного 32-разрядного и одного 8-разрядного компонентов неизвестного типа, остальные 24 бита не используются.DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS
— 64 бита в элементе, логически состоящем из одного 32-разрядного вещественного компонента и ещё 32 неиспользуемых битов, формально поделённых на группы в 8 и 24 разряда.DXGI_FORMAT_X32_TYPELESS_G8X24_UINT
— 64 бита в элементе, логически состоящем из 32 неиспользуемых битов, 8-разрядного беззнакового целого элемента и ещё 24 неиспользуемых битов.DXGI_FORMAT_R10G10B10A2_TYPELESS
— 32 бита в элементе, логически состоящем из трёх 10-разрядных и одного 2-разрядного компонентов неизвестного типа.DXGI_FORMAT_R10G10B10A2_UNORM
— 32 бита в элементе, логически состоящем из трёх 10-разрядных и одного 2-разрядного нормализованных беззнаковых целых компонентов.DXGI_FORMAT_R10G10B10A2_UINT
— 32 бита в элементе, логически состоящем из трёх 10-разрядных и одного 2-разрядного беззнаковых целых компонентов.DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM
— 32 бита в элементе, логически состоящем из трёх 10-разрядных смещённых на 2.8 значений с фиксированной запятой и одного 2-разрядного нормализованного беззнакового целого. Поддержка возможна в Direct3D 10 и обязательна, начиная с Direct3D 10.1.DXGI_FORMAT_R11G11B10_FLOAT
— 32 бита в элементе, логически состоящем из трёх вещественных чисел: два первых (R в младших битах элемента и G в средних) имеют 5-разрядный порядок и 6-разрядную мантиссу, третье (B в старших битах элемента) — 5-разрядные порядок и мантиссу.DXGI_FORMAT_R8G8B8A8_TYPELESS
— 32 бита в элементе, логически состоящем из четырёх 8-разрядных компонентов неизвестного типа.DXGI_FORMAT_R8G8B8A8_UNORM
— 32 бита в элементе, логически состоящем из четырёх 8-разрядных нормализованных беззнаковых целых компонентов.DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
— 32 бита в элементе, логически состоящем из четырёх 8-разрядных нормализованных беззнаковых целых компонентов, соответствующих стандарту sRGB.DXGI_FORMAT_R8G8B8A8_UINT
— 32 бита в элементе, логически состоящем из четырёх 8-разрядных беззнаковых целых компонентов.DXGI_FORMAT_R8G8B8A8_SNORM
— 32 бита в элементе, логически состоящем из четырёх 8-разрядных нормализованных знаковых целых компонентов.DXGI_FORMAT_R8G8B8A8_SINT
— 32 бита в элементе, логически состоящем из четырёх 8-разрядных знаковых целых компонентов.DXGI_FORMAT_R16G16_TYPELESS
— 32 бита в элементе, логически состоящем из двух 16-разрядных компонентов неизвестного типа.DXGI_FORMAT_R16G16_FLOAT
— 32 бита в элементе, логически состоящем из двух 16-разрядных вещественных компонентов.DXGI_FORMAT_R16G16_UNORM
— 32 бита в элементе, логически состоящем из двух 16-разрядных нормализованных беззнаковых целых компонентов.DXGI_FORMAT_R16G16_UINT
— 32 бита в элементе, логически состоящем из двух 16-разрядных беззнаковых целых компонентов.DXGI_FORMAT_R16G16_SNORM
— 32 бита в элементе, логически состоящем из двух 16-разрядных нормализованных знаковых целых компонентов.DXGI_FORMAT_R16G16_SINT
— 32 бита в элементе, логически состоящем из двух 16-разрядных знаковых целых компонентов.DXGI_FORMAT_R32_TYPELESS
— 32 бита в элементе, логически состоящем из единственного 32-разрядного компонента неизвестного типа.DXGI_FORMAT_R32_FLOAT
— 32 бита в элементе, логически состоящем из единственного 32-разрядного вещественного компонента.DXGI_FORMAT_R32_UINT
— 32 бита в элементе, логически состоящем из единственного 32-разрядного беззнакового целого компонента.DXGI_FORMAT_R32_SINT
— 32 бита в элементе, логически состоящем из единственного 32-разрядного знакового целого компонента.DXGI_FORMAT_R24G8_TYPELESS
— 32 бита в элементе, логически состоящем из 24- и 8-разрядного компонентов неизвестного типа.DXGI_FORMAT_R24_UNORM_X8_TYPELESS
— 32 бита в элементе, логически состоящем из одного 24-разрядного нормализованного беззнакового целого комонента, ещё 8 битов не используются.DXGI_FORMAT_X24_TYPELESS_G8_UINT
— 32 бита в элементе, логически состоящем из 24 неиспользуемых разрядов и одного 8-разрядного беззнакового целого компонента.DXGI_FORMAT_R8G8_TYPELESS
— 16 битов в элементе, логически состоящем из двух 8-разрядных компонентов неизвестного типа.DXGI_FORMAT_R8G8_UNORM
— 16 битов в элементе, логически состоящем из двух 8-разрядных нормализованных беззнаковых целых компонентов.DXGI_FORMAT_R8G8_UINT
— 16 битов в элементе, логически состоящем из двух 8-разрядных беззнаковых целых компонентов.DXGI_FORMAT_R8G8_SNORM
— 16 битов в элементе, логически состоящем из двух 8-разрядных нормализованных знаковых целых компонентов.DXGI_FORMAT_R8G8_SINT
— 16 битов в элементе, логически состоящем из двух 8-разрядных знаковых целых компонентов.DXGI_FORMAT_R16_TYPELESS
— 16 битов в элементе, логически состоящем из одного 16-разрядного компонента неизвестного типа.DXGI_FORMAT_R16_FLOAT
— 16 битов в элементе, логически состоящем из одного 16-разрядного вещественного компонента.DXGI_FORMAT_R16_UNORM
— 16 битов в элементе, логически состоящем из одного 16-разрядного нормализованного беззнакового целого компонента.DXGI_FORMAT_R16_UINT
— 16 битов в элементе, логически состоящем из одного 16-разрядного беззнакового целого компонента.DXGI_FORMAT_R16_SNORM
— 16 битов в элементе, логически состоящем из одного 16-разрядного нормализованного знакового целого компонента.DXGI_FORMAT_R16_SINT
— 16 битов в элементе, логически состоящем из одного 16-разрядного знакового целого компонента.DXGI_FORMAT_R8_TYPELESS
— 8 битов в элементе, логически состоящем из одного 8-разрядного компонента неизвестного типа.DXGI_FORMAT_R8_UNORM
— 8 битов в элементе, логически состоящем из одного 8-разрядного нормализованного беззнакового целого компонента.DXGI_FORMAT_R8_UINT
— 8 битов в элементе, логически состоящем из одного 8-разрядного беззнакового целого компонента.DXGI_FORMAT_R8_SNORM
— 8 битов в элементе, логически состоящем из одного 8-разрядного нормализованного знакового целого компонента.DXGI_FORMAT_R8_SINT
— 8 битов в элементе, логически состоящем из одного 8-разрядного знакового целого компонента.DXGI_FORMAT_A8_UNORM
— 8 битов в элементе, логически состоящем из одного 8-разрядного нормализованного беззнакового целого компонента, хранящего прозрачность.DXGI_FORMAT_R9G9B9E5_SHAREDEXP
— 32 бита в элементе, логически состоящем из трёх вещественных компонентов. Каждый компонент имеет свою собственную 9-разрядную мантиссу (хранятся в порядке R, G, B начиная с младших битов элемента); порядок для всех трёх компонентов одинаков и занимает пять старших разрядов элемента.
Форматы, связанные с обработкой глубины и шаблона
DXGI_FORMAT_D32_FLOAT_S8X24_UINT
— 64 бита в элементе, логически состоящем из одного 32-разрядного вещественного компонента (глубина) и одного 8-разрядного беззнакового целого компонента (шаблон), оставшиеся 24 бита не используются.DXGI_FORMAT_D32_FLOAT
— 32 бита в элементе, логически состоящем из единственного 32-разрядного вещественного компонента, содержащего глубину.DXGI_FORMAT_D24_UNORM_S8_UINT
— 32 бита в элементе, логически состоящем из двух компонентов: 24-разрядного нормализованного беззнакового целого (глубина) и 8-разрядного беззнакового целого (шаблон).DXGI_FORMAT_D16_UNORM
— 16 битов в элементе, логически состоящем из одного 16-разрядного нормализованного беззнакового целого компонента, хранящего глубину.
Упакованные форматы
DXGI_FORMAT_BC1_TYPELESS
— сжатые данные.DXGI_FORMAT_BC1_UNORM
— сжатые данные.DXGI_FORMAT_BC1_UNORM_SRGB
— сжатые данные.DXGI_FORMAT_BC2_TYPELESS
— сжатые данные.DXGI_FORMAT_BC2_UNORM
— сжатые данные.DXGI_FORMAT_BC2_UNORM_SRGB
— сжатые данные.DXGI_FORMAT_BC3_TYPELESS
— сжатые данные.DXGI_FORMAT_BC3_UNORM
— сжатые данные.DXGI_FORMAT_BC3_UNORM_SRGB
— сжатые данные.DXGI_FORMAT_BC4_TYPELESS
— сжатые данные.DXGI_FORMAT_BC4_UNORM
— сжатые данные.DXGI_FORMAT_BC4_SNORM
— сжатые данные.DXGI_FORMAT_BC5_TYPELESS
— сжатые данные.DXGI_FORMAT_BC5_UNORM
— сжатые данные.DXGI_FORMAT_BC5_SNORM
— сжатые данные.DXGI_FORMAT_BC6H_TYPELESS
— сжатые данные.DXGI_FORMAT_BC6H_UF16
— сжатые данные.DXGI_FORMAT_BC6H_SF16
— сжатые данные.DXGI_FORMAT_BC7_TYPELESS
— сжатые данные.DXGI_FORMAT_BC7_UNORM
— сжатые данные.DXGI_FORMAT_BC7_UNORM_SRGB
— сжатые данные.
Форматы, обеспечивающие хранение цветов в обратном порядке
Все эти форматы формально определены уже в Direct3D 10, однако реальная их поддержка, хотя и улучшается по мере увеличения номера версии, в полном объёме остаётся необязательной даже в Direct3D 12.1. Они нужны, главным образом, для того, чтобы обеспечить вывод информации о пикселях с порядком следования цветовых каналов BGR вместо RGB.
DXGI_FORMAT_B5G6R5_UNORM
— 16 бита в элементе, логически состоящем из трёх нормализованных беззнаковых целых компонентов размером 5, 6 и снова 5 битов. Реальная поддержка начинается с Direct3D 11.1.DXGI_FORMAT_B5G5R5A1_UNORM
— 16 бита в элементе, логически состоящем из четырёх нормализованных беззнаковых целых компонентов, три из которых имеют размер 5 битов, а четвёртый — 1 бит. Реальная поддержка начинается с Direct3D 11.1.DXGI_FORMAT_B8G8R8A8_TYPELESS
— 32 бита в элементе, логически состоящем из четырёх 8-разрядных компонентов неизвестного типа.DXGI_FORMAT_B8G8R8A8_UNORM
— 32 бита в элементе, логически состоящем из четырёх 8-разрядных нормализованных беззнаковых целых компонентов.DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
— 32 бита в элементе, логически состоящем из четырёх 8-разрядных нормализованных беззнаковых целых компонентов, соответствующих стандарту sRGB.DXGI_FORMAT_B8G8R8X8_TYPELESS
— 32 бита в элементе, логически состоящем из трёх 8-разрядных компонентов неизвестного типа, ещё 8 битов не используются.DXGI_FORMAT_B8G8R8X8_UNORM
— 32 бита в элементе, логически состоящем из трёх 8-разрядных нормализованных беззнаковых целых компонентов, ещё 8 битов не используются.DXGI_FORMAT_B8G8R8X8_UNORM_SRGB
— 32 бита в элементе, логически состоящем из трёх 8-разрядных нормализованных беззнаковых целых компонентов, соответствующих стандарту sRGB; ещё 8 битов не используются.DXGI_FORMAT_B4G4R4A4_UNORM
— 16 битов в элементе, логически состоящем из четырёх 4-разрядных нормализованных беззнаковых целых компонентов. Реальная поддержка начинается с Direct3D 11.1.
Форматы, связанные с обработкой видео
DXGI_FORMAT_R8G8_B8G8_UNORM
— 32 бита в элементе, логически состоящем из четырёх 8-разрядных нормализованных беззнаковых целых компонентов. Эти четыре компонента описывают цвет двух пикселей, причём каналы R и B имеют одинаковое значение для обоих пикселей, а канал G — разное. Этот формат аналогичен видеоформату UYVY.DXGI_FORMAT_G8R8_G8B8_UNORM
— 32 бита в элементе, логически состоящем из четырёх 8-разрядных нормализованных беззнаковых целых компонентов. Эти четыре компонента описывают цвет двух пикселей, причём каналы R и B имеют одинаковое значение для обоих пикселей, а канал G — разное. Этот формат аналогичен видеоформату YUY2.DXGI_FORMAT_AYUV
DXGI_FORMAT_Y410
DXGI_FORMAT_Y416
DXGI_FORMAT_NV12
DXGI_FORMAT_P010
DXGI_FORMAT_P016
DXGI_FORMAT_420_OPAQUE
DXGI_FORMAT_YUY2
DXGI_FORMAT_Y210
DXGI_FORMAT_Y216
DXGI_FORMAT_NV11
DXGI_FORMAT_AI44
DXGI_FORMAT_IA44
DXGI_FORMAT_P8
DXGI_FORMAT_A8P8
DXGI_FORMAT_P208
DXGI_FORMAT_V208
DXGI_FORMAT_V408
Форматы, не описанные в документации
DXGI_FORMAT_R1_UNORM
DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE
DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE