Использование DirectX с расширенным цветом на дисплеях высокого или стандартного динамического диапазона

В этом разделе показано, как использовать DirectX с сценариями расширенного цвета, включая высокий динамический диапазон (HDR), широкий цветной гаммы (WCG) с автоматическим управлением цветами системы и высокой глубиной. Экраны персональных компьютеров уровня "Премиум" с по крайней мере одним из описанных выше улучшений становятся широко распространенными, обеспечивая значительно более высокую точность цвета, чем традиционные стандартные динамические диапазоны (SDR).

В этом разделе вы получите общие сведения о ключевых технических понятиях, лежащих в поддержке расширенного цвета Windows. Вы узнаете о требованиях и инструкциях по отрисовке содержимого HDR, WCG и содержимого DirectX с высокой глубиной в одном из этих дисплеев. Если у вас есть управляемое цветом приложение (например, с помощью профилей ICC), вы узнаете, как автоматическое управление цветами обеспечивает лучшую точность цвета для ваших сценариев.

Общие сведения о расширенном цвете в Windows

Расширенный цвет — это зонтичный термин технологий операционной системы (ОС) для дисплеев с значительно более высокой точностью цвета, чем стандартные. В следующих разделах описаны преобладающие расширенные возможности. Возможности расширенного цвета были впервые представлены для дисплеев HDR с Windows 10 версии 1709 (Fall Creators Update), а также для специально подготовленных экранов SDR с Windows 11 версии 22H2 (10.0; Выпуск сборки 22621.

Высокий динамический диапазон

Динамический диапазон ссылается на разницу между максимальным и минимальным светом в сцене; это часто измеряется в нитах (кандель на квадратный сантиметр). Реальные сцены, такие как этот закат, часто имеют динамические диапазоны 10 порядков величины света; Человеческий глаз может различить еще больший диапазон после адаптации.

picture of a sunset with brightness and darkest points in the scene labeled

С момента Direct3D 9 графические подсистемы смогли внутренне отрисовать свои сцены с таким уровнем физической точности. Однако типичный стандартный динамический диапазон отображения может воспроизводить только чуть более 3 порядка величины светимости, и поэтому любое содержимое, отрисованное HDR, должно быть тонировано (сжатым) в ограниченный диапазон дисплея. Новые дисплея HDR, включая те, которые соответствуют стандарту HDR10 (BT.2100), прервать это ограничение; Например, высококачественные самоуправляемые отображения могут достичь более 6 порядков величины.

Широкий цветной гаммы

Цветовая гамма относится к диапазону и насыщенности оттенков, которые может воспроизвести дисплей. Самые насыщенные естественные цвета человеческого глаза могут восприниматься из чистого монохромного света, например, который производится лазерами. Однако основное отображение потребителей часто может воспроизводить цвета только в гамме SRGB, который представляет только около 35% всех человеческих, доступных для восприятия цветов. На схеме ниже представлено представление человеческого "спектрального локуса", или всех доступных цветов (на заданном уровне света), где меньший треугольник является гаммой SRGB.

diagram of the human spectral locus and sRGB gamut

Высокопроизводительные, профессиональные экраны ПК имеют длинные поддерживаемые цветовые гальмуты, которые значительно шире, чем sRGB, такие как Adobe RGB и DCI-P3, охватывающие около половины человеческих удобочитаемых цветов. И эти широкие гаммы отображаются все чаще.

Автоматическое управление цветами системы

Управление цветами — это технология и практика обеспечения точного и согласованного воспроизведения цветов на разных устройствах. Если вы являетесь создателем цифрового контента, его важное значение для цветов визуального содержимого( например, фотографии, изображения продукта или логотипа), которое будет отображаться на экране так же, как и на различных цифровых устройствах аудитории.

Windows предоставляет API-интерфейсы управления цветами с Windows 2000 с помощью API управления цветами изображений (ICM) и более поздних версий API системы цветов Windows (WCS ). Тем не менее, эти API были вспомогательными только для приложений, которые хотели или необходимы для управления цветами; хотя большинство приложений и цифрового содержимого просто предполагают стандартное цветовое пространство SRGB в отрасли и никогда не управлялись цветом операционной системы. Это было разумным предположением в прошлом, но высококачественные широкое отображение гаммы становятся гораздо более распространенными.

Новые версии Windows поддерживают автоматическое управление цветами системы; это гарантирует, что все цвета в каждом приложении Windows, независимо от того, являются ли они цветообразующими, отображаются точно и согласованно на каждом поддерживаемом дисплее.

Примечание.

Автоматическое управление цветами не является свойством оборудования отображения; Вместо этого это функция Windows для правильной поддержки отображения с большим цветом gamuts, чем sRGB.

Глубина глубокой точности и битовой глубины

Числовая точность или глубина бита относится к объему информации, используемой для уникального определения цветов. Более высокая глубина бита означает, что можно различать очень похожие цвета без артефактов, таких как перевязка. Основной компьютер отображает 8 бит на канал цвета, в то время как человеческий глаз требует по крайней мере 10-12 бит точности, чтобы избежать воспринимаемых искажений.

picture of windmills at a simulated 2 bits per color channel vs. 8 bits per channel

До расширенного цвета диспетчер окон рабочего стола (DWM) с ограниченным окном приложения для вывода содержимого только на 8 бит на канал цветов, даже если дисплей поддерживает более высокую глубину. Если включен расширенный цвет, DWM выполняет свою композицию с помощью с плавающей запятой с плавающей запятой (FP16), устраняя все узкие места и позволяя использовать полную точность дисплея.

Архитектура расширенной цветовой системы Windows

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

В этом разделе мы будем использовать упрощенную схему для описания соответствующих компонентов графического стека Windows:

block diagram of Windows graphics stack: app to DWM to display kernel

Существующие окна: 8-разрядные или sRGB-экраны

В течение десятилетий потребительские экраны и графический стек Windows были основаны на 8 битах на канал (24 бит на пиксель) содержимое SRGB. Приложения, использующие графические API, такие как DirectX, могут выполнять внутреннюю отрисовку с помощью больших битовых глубин и расширенных цветовых пространств; Однако ОС поддерживает только 8-разрядное целое число с неявным sRGB и без системного управления цветами:

block diagram of SDR display stack: limited to sRGB, 8-bit, with no color management

Это означает, что при отображении все дополнительные данные цвета, отображаемые приложением, будут потеряны; и что приложению пришлось самостоятельно выполнять управление цветами, чтобы обеспечить точное воспроизведение на дисплее.

Windows 10 версии 1703: HDR отображается с расширенным цветом

Windows 10 версии 1703 представила первую версию возможностей расширенного цвета для дисплеев HDR. Это потребовало нескольких значительных достижений в графическом стеке ОС:

  • Поддержка передачи сигналов в HDR
  • Системная композиция с использованием высотной глубины канонического цветового пространства
  • Автоматическое управление цветами системы

block diagram of HDR display stack: FP16, scRGB, with auto color management

Каждый прогресс рассматривается в подразделах ниже. Чистый результат заключается в том, что расширенные данные цвета приложения теперь правильно сохраняются ОС и точно воспроизводится на дисплеях HDR.

Поддержка передачи сигналов в HDR

HDR сигнализирует о соединителях отображения, таких как DisplayPort и HDMI, в основном использует 10 битов на канал точности (или больше) и цветовое пространство BT.2100 ST.2084. Ядро дисплея, драйвер отображения и базовое оборудование GPU должны поддерживать обнаружение, выбор и управление этим режимом сигналов.

Системная композиция с использованием высотной глубины канонического цветового пространства

Цветовое пространство BT.2100 ST.2084 является эффективным стандартом для кодирования цветов HDR, но он не подходит для многих операций отрисовки и композиции (смешивания). Мы также хотим подтвердить, что ОС поддерживает технологии и цветовые пространства далеко за пределами BT.2100, которая охватывает менее 2/3 из видимых человеком цветов. Наконец, где это возможно, мы хотим свести к минимуму потребление ресурсов GPU, чтобы повысить мощность и производительность.

В режиме HDR диспетчер окон рабочего стола (DWM) использует каноническое цветовое пространство композиции (CCCS), определенное как:

  • цветовое пространство scRGB (первичные базы данных BT.709/sRGB с линейной гаммой)
  • Точность половины IEEE (глубина FP16 бита)

Это обеспечивает хороший баланс между всеми приведенными выше целями. CCCS позволяет использовать значения цветов вне числового диапазона [0, 1]; учитывая диапазон допустимых значений FP16, он может представлять порядки больше цветов, чем естественный визуальный диапазон человека, включая значения света более 5 миллионов нит. FP16 имеет отличную точность для линейных операций гамма-смешения, но затраты на половину потребления памяти GPU и пропускной способности традиционной единой точности (FP32) без потери качества.

Автоматическое управление цветами системы

Windows — это многозадачная среда, в которой пользователь может запускать любое количество приложений SDR и HDR одновременно с перекрывающимися окнами. Поэтому важно, чтобы все типы содержимого выглядели правильно и при максимальном качестве при выходе на дисплей; Например, приложение для повышения производительности SDR (SDR) sRGB с окном видео BT.2100 ST.2084 (HDR), воспроизводимым над ним.

В режиме HDR Windows выполняет операции управления цветами на двух этапах:

  1. DWM преобразует каждое приложение из собственного цветового пространства в CCCS перед смешения.
  2. Ядро дисплея преобразует фреймбаффер ОС из CCCS в цветовое пространство формата провода (BT.2100 ST.2084).
    • При необходимости ядро дисплея работает с драйвером дисплея для выполнения дополнительной калибровки цвета дисплея; Дополнительные сведения см. в статье о конвейере калибровки цветов в оборудовании Windows.

block diagram of auto color management occuring in DWM and display kernelblock diagram of auto color management occuring in DWM and display kernel, part 2

Примечание.

На обоих этапах операция управления цветом состоит из преобразования цветового пространства (матрица и 1DLUT). Цвета, превышающие конечную цветовую палитру дисплея, числовые обрезки.

Windows 11 версии 22H2: SDR отображается с расширенным цветом

Хотя распространенность дисплеев HDR быстро растет, мониторы SDR останутся важными на протяжении многих лет. Поддержка HDR в Windows 10 версии 1703 заложила большую часть основы, необходимой для улучшения отображения SDR. Windows 11 версии 22H2 расширяет возможности расширенного цвета и автоматического управления цветами до определенных соответствующих дисплеев SDR. Диаграмма графического блока для расширенного цвета SDR выглядит очень похоже на HDR:

block diagram of SDR AC display stack: FP16, scRGB, with auto color management

Поддержка сигналов SDR с высокой битовой глубиной

Базовый сигнал для отображения SDR не изменяется, хотя выпуск Windows 11 версии 22H2 поддерживает 10 бит на канал и больше в зависимости от возможностей дисплея.

Системная композиция с использованием высотной глубины канонического цветового пространства

Функции расширенного цвета DWM, включая смешивание в CCCS, почти полностью не изменяются на дисплеях HDR. Основное отличие заключается в том, что DWM использует отображаемую светимость с отображением SDR, а также светимость сцены с дисплеями HDR. Это изменяет способ интерпретации содержимого расширенного цвета операционной системой:

Тип отображения Поведение светимости Как интерпретируется 1.0f
SDR Ссылка на отображение Как эталонный белый уровень дисплея
HDR Сцена, на которую ссылается Как 80 нит (номинальная ссылка белый)

Автоматическое управление цветами системы

Возможности управления цветами ОС также в основном не изменяются на дисплеях HDR. Основное различие заключается в том, что ядро отображения преобразуется в цветовое пространство, называемое отображением, как определено цветометрией и данными калибровки дисплея, а не стандартного цветового пространства BT.2100 ST.2084 для дисплеев HDR.

Отображение требуемой подготовки

Точные данные из профиля MHC ICC необходимы для определения операции управления выходными цветами ядра дисплея. Таким образом, для автоматического управления цветами могут быть подготовлены только средства SDR, подготовленные производителем или поставщиком калибровки дисплея с допустимым профилем. Дополнительные сведения см . в разделе "Поведение профиля ICC" с дополнительным цветом .

Требования к системе и поддержка операционной системы

Windows 10 версии 1709 впервые поставляется поддержка расширенного цвета для дисплеев HDR. Выпуск Windows 11 версии 22H2 добавляет расширенную поддержку цвета для отображения SDR с точными данными подготовки.

В этом разделе предполагается, что приложение предназначено для windows 10 версии 2004 (или более поздней) для отображения HDR, а также выпуск Windows 11 версии 22H2 (или более поздней) для отображения SDR.

Отображение

Дисплей с высоким динамическим диапазоном должен реализовать стандарт HDR10 или BT.2100 ST.2084. Качество отображения HDR может значительно отличаться, и настоятельно рекомендуется отображать сертифицированные, например VESA DisplayHDR. Начиная с выпуска Windows 11 версии 22H2 Windows отображает состояние сертификации известных дисплеев в приложении Параметры.

Стандартный динамический диапазон отображения должен иметь точные данные подготовки цветов для расширенной поддержки цвета. В выпуске Windows 11 версии 22H2 единственным поддерживаемым методом переопределения этих данных является профиль MHC ICC; Кроме того, пользователь или производитель дисплея должен включить автоматическое управление цветами. Дополнительные сведения см. в разделе "Поведение профиля ICC с расширенным цветом".

Графический процессор (GPU)

Для полной функции расширенного цвета на дисплеях SDR и HDR требуется недавний GPU:

  • AMDЗаполнения RX 400 серии (Polaris) или более поздней версии
  • Серия NVIDIA GeForce 10 (Pascal) или более позднюю версию
  • Выбранный Intel Core 10-го поколения (Ice Lake) или более поздней версии*

Примечание.

Наборы микросхем Intel code name Comet Lake (5 цифр модели) не обеспечивают полную функциональность.

Дополнительные требования к оборудованию могут применяться в зависимости от сценариев, включая аппаратное ускорение кодека (10-разрядное HEVC, 10-разрядное VP9 и т. д.) и поддержку PlayReady (SL3000). Обратитесь к поставщику GPU для получения дополнительных сведений.

Графический драйвер (WDDM)

Последний доступный графический драйвер настоятельно рекомендуется использовать либо из Обновл. Windows, либо от поставщика GPU или веб-сайта производителя ПК. В этом разделе используются функции драйверов из WDDM 2.7 (Windows 10 версии 2004) для дисплеев HDR и WDDM 3.0 (Windows 11 версии 21H2) для отображения SDR.

Поддерживаемые API отрисовки

Windows 10 поддерживает широкий спектр API-интерфейсов и платформ отрисовки. Расширенная поддержка цветов в основном зависит от того, что ваше приложение может выполнять современную презентацию с помощью DXGI или API визуального слоя.

Поэтому любой API отрисовки, который может выводиться в один из этих методов презентаций, может поддерживать расширенный цвет. Это включает (но не ограничивается) приведенным ниже.

  • Direct3D 11
  • Direct3D 12
  • Direct2D
  • Win2D
    • Требуется использовать API CanvasSwapChain или CanvasSwapChainPanel нижнего уровня.
  • Windows.UI.Input.Inking
    • Поддерживает настраиваемую отрисовку сухого рукописного ввода с помощью DirectX.
  • XAML
    • Поддерживает воспроизведение видео HDR с помощью MediaPlayerElement.
    • Поддерживает декодирование изображений JPEG XR с помощью элемента Image .
    • Поддерживает взаимодействие DirectX с помощью SwapChainPanel.

Обработка возможностей динамического отображения

Windows 10 поддерживает огромный спектр дисплеев с поддержкой расширенного цвета, от эффективных интегрированных панелей до высокопроизводительных игровых мониторов и телевизоров. Пользователи Windows ожидают, что ваше приложение будет легко обрабатывать все эти варианты, в том числе вездесущие существующие мониторы SDR.

Windows 10 обеспечивает управление возможностями HDR и Advanced Color для пользователя. Приложение должно обнаруживать конфигурацию текущего дисплея и динамически реагировать на любые изменения возможностей. Это может произойти по многим причинам, например, так как пользователь включил или отключил функцию, или переместил приложение между разными дисплеями или состояние питания системы изменилось.

Вариант 1. AdvancedColorInfo

Примечание.

API AdvancedColorInfo среда выполнения Windows доступен независимо от API отрисовки, поддерживает расширенный цвет для отображения SDR и использует события для сигналов при изменении возможностей. Однако он доступен только для приложений универсальная платформа Windows (UWP), классические приложения (которые не имеют CoreWindow) не могут использовать его. Дополнительные сведения см. в разделе среда выполнения Windows API, которые не поддерживаются в классических приложениях.

Сначала получите экземпляр AdvancedColorInfo из DisplayInformation::GetAdvancedColorInfo.

Чтобы проверка тип расширенного цвета в данный момент активен, используйте свойство AdvancedColorInfo::CurrentAdvancedColorKind. Это самое важное свойство для проверка, и вы должны настроить конвейер отрисовки и презентации в ответ на активный вид:

Расширенный цвет Возможности отображения
SDR Отображение SDR без дополнительных возможностей цвета
WCG Отображение SDR с высокой глубиной и автоматическим управлением цветами
HDR Отображение HDR со всеми возможностями расширенного цвета

Чтобы проверка поддерживаемые расширенные типы цветов, но не обязательно активны, вызовите AdvancedColorInfo::IsAdvancedColorKindAvailable. Эти сведения можно использовать, например, для запроса пользователя перейти к приложению Windows Параметры, чтобы включить hdR или автоматическое управление цветами.

Другие члены AdvancedColorInfo предоставляют количественные сведения о томе физического цвета панели (сияние и хрома), соответствующие статическим метаданным HDR SMPTE ST.2086. Несмотря на то, что ST.2086 изначально разработан для дисплеев HDR, эта информация полезна и доступна для дисплеев HDR и SDR. Эти сведения следует использовать для настройки сопоставления тонов приложения и сопоставления параметров.

Чтобы обрабатывать изменения в возможностях расширенного цвета, зарегистрируйтесь для события DisplayInformation::AdvancedColorInfoChanged . Это событие возникает, если любой параметр возможностей расширенного цвета дисплея изменяется по какой-либо причине.

Обработайте это событие путем получения нового экземпляра AdvancedColorInfo и проверка изменения значений.

IDXGIOutput6

Примечание.

Интерфейс IDXGIOutput6 инфраструктуры графики DirectX доступен для любого приложения, использующего DirectX, будь то классический или универсальная платформа Windows (UWP). Однако IDXGIOutput6не поддерживает отображение SDR с расширенными возможностями цвета, такими как автоматическое управление цветами; оно может идентифицировать только экраны HDR.

Если вы пишете классическое приложение Win32 и используете DirectX для отрисовки, используйте DXGI_OUTPUT_DESC1 для получения возможностей отображения. Получите экземпляр этой структуры с помощью IDXGIOutput6::GetDesc1.

Чтобы проверка тип расширенного цвета в настоящее время активен, используйте свойство ColorSpace, которое имеет тип DXGI_COLOR_SPACE_TYPE, и содержит одно из следующих значений:

DXGI_COLOR_SPACE_TYPE Возможности отображения
DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 Отображение SDR без дополнительных возможностей цвета
DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 Отображение HDR со всеми возможностями расширенного цвета

Примечание.

Отображение SDR с расширенными возможностями цвета также сообщается как DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709; DXGI не позволяет различать два типа.

Примечание.

DXGI не позволяет проверка какие типы расширенных цветов поддерживаются, но не активны в данный момент.

Большинство других элементов DXGI_OUTPUT_DESC1 предоставляют количественные сведения о физическом цвете панели (светимость и хроминанс), соответствующие статическим метаданным HDR SMPTE ST.2086. Несмотря на то, что ST.2086 изначально предназначен для отображения HDR, эта информация полезна и доступна для дисплеев HDR и SDR. Эти сведения следует использовать для настройки сопоставления тонов приложения и сопоставления параметров.

Классические приложения Win32 не имеют собственного механизма для реагирования на изменения возможностей расширенного цвета. Вместо этого, если приложение использует цикл отрисовки, необходимо запросить IDXGIFactory1::IsCurrent с каждым кадром. Если он сообщает FALSE, необходимо получить новый DXGI_OUTPUT_DESC1 и проверка, какие значения изменились.

Кроме того, насос сообщений Win32 должен обрабатывать сообщение WM_SIZE , указывающее, что ваше приложение может перемещаться между различными дисплеями.

Примечание.

Чтобы получить новый DXGI_OUTPUT_DESC1, необходимо получить текущее отображение. Однако не следует вызывать IDXGISwapChain::GetContainingOutput. Это связано с тем, что цепочки буферов возвращают устаревшие выходные данные DXGI после ТОГО, как DXGIFactory::IsCurrent имеет значение false; и воссоздание цепочки буферов для получения текущих выходных данных приводит к временному черному экрану. Вместо этого рекомендуется перечислить границы всех выходных данных DXGI и определить, какой из них имеет наибольшее пересечение с границами окна приложения.

Следующий пример кода поставляется из примера приложения HDR Direct3D 12 на GitHub.

// Retrieve the current default adapter.
ComPtr<IDXGIAdapter1> dxgiAdapter;
ThrowIfFailed(m_dxgiFactory->EnumAdapters1(0, &dxgiAdapter));

// Iterate through the DXGI outputs associated with the DXGI adapter,
// and find the output whose bounds have the greatest overlap with the
// app window (i.e. the output for which the intersection area is the
// greatest).

UINT i = 0;
ComPtr<IDXGIOutput> currentOutput;
ComPtr<IDXGIOutput> bestOutput;
float bestIntersectArea = -1;

while (dxgiAdapter->EnumOutputs(i, &currentOutput) != DXGI_ERROR_NOT_FOUND)
{
    // Get the retangle bounds of the app window
    int ax1 = m_windowBounds.left;
    int ay1 = m_windowBounds.top;
    int ax2 = m_windowBounds.right;
    int ay2 = m_windowBounds.bottom;

    // Get the rectangle bounds of current output
    DXGI_OUTPUT_DESC desc;
    ThrowIfFailed(currentOutput->GetDesc(&desc));
    RECT r = desc.DesktopCoordinates;
    int bx1 = r.left;
    int by1 = r.top;
    int bx2 = r.right;
    int by2 = r.bottom;

    // Compute the intersection
    int intersectArea = ComputeIntersectionArea(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2);
    if (intersectArea > bestIntersectArea)
    {
        bestOutput = currentOutput;
        bestIntersectArea = static_cast<float>(intersectArea);
    }

    i++;
}

// Having determined the output (display) upon which the app is primarily being 
// rendered, retrieve the HDR capabilities of that display by checking the color space.
ComPtr<IDXGIOutput6> output6;
ThrowIfFailed(bestOutput.As(&output6));

DXGI_OUTPUT_DESC1 desc1;
ThrowIfFailed(output6->GetDesc1(&desc1));

Настройка цепочки буферов DirectX

После определения того, что в настоящее время дисплей поддерживает расширенные возможности цвета, настройте цепочку буферов следующим образом.

Использование эффекта модели сверток презентации

При создании цепочки буферов с помощью одного из CreateSwapChainFor[Hwnd|Композиция |Методы CoreWindow] необходимо использовать модель переверки DXGI, выбрав параметр DXGI_SWAP_EFFECT_Fпакет интерфейса пользователя_SEQUENTIAL или DXGI_SWAP_EFFECT_Fпакет интерфейса пользователя_DISCARD, что делает цепочку буферов доступной для расширенной обработки цветов из DWM и различных полноэкранных оптимизаций. Дополнительные сведения см. в разделе "Лучшие показатели производительности" используйте модель переверки DXGI.

Вариант 1. Использование формата пикселей FP16 и цветового пространства scRGB

Windows 10 поддерживает два основных сочетания формата пикселей и цветового пространства для расширенного цвета. Выберите его на основе конкретных требований вашего приложения.

Мы рекомендуем использовать вариант 1 для приложений общего назначения. Это единственный вариант, который работает для всех типов расширенных цветов, содержимого и API-интерфейсов отрисовки. При создании цепочки буферов укажите DXGI_FORMAT_R16G16B16A16_FLOAT в DXGI_SWAP_CHAIN_DESC1. По умолчанию цепочка буферов, созданная с форматом пикселей с плавающей запятой, обрабатывается так, как если бы он использовал DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709 цветовое пространство. Это тот же формат пикселя и цветовое пространство, используемое DWM.

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

Однако этот параметр потребляет 64 бита на пиксель, что увеличивает пропускную способность GPU и потребление памяти по сравнению с традиционными форматами пикселей UINT8. Кроме того, scRGB использует числовые значения, которые находятся за пределами нормализованного диапазона [0, 1] для представления цветов, которые находятся за пределами гаммы sRGB и/или больше 80 нит света. Например, scRGB (1.0, 1.0, 1.0) кодирует стандартный белый D65 в 80 нит; но scRGB (12.5, 12.5, 12.5) кодирует тот же D65 белый на гораздо более ярких 1000 нит. Для некоторых графических операций требуется нормализованный числовый диапазон, и необходимо изменить операцию или повторно нормализовать значения цвета.

Способ интерпретации значений света с помощью этого параметра отличается от SDR и HDR; см. ниже.

Вариант 2. Использование формата пикселей UINT10/RGB10 и цветового пространства HDR10/BT.2100

Вариант 2 — это оптимизация производительности, доступная только в том случае, если ваше приложение соответствует всем следующим условиям:

  • Предназначено для отображения HDR
  • Использует Direct3D 12 или Direct3D 11
  • Цепочка буферов не требует смешивания с альфа-прозрачностью

Если приложение не соответствует всем этим условиям, необходимо использовать вариант 1.

Но если приложение соответствует варианту 2, то это может обеспечить лучшую производительность, если ваше приложение использует содержимое в кодировке HDR10, например видеопроигрыватель, или если оно в основном будет использоваться в полноэкранных сценариях, таких как игра. При создании цепочки буферов следует указать DXGI_FORMAT_R10G10B10A2_UNORM в DXGI_SWAP_CHAIN_DESC1. По умолчанию это рассматривается как использование цветового пространства sRGB; поэтому необходимо явно вызвать IDXGISwapChain3::SetColorSpace1 и задать в качестве цветового пространства DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020, также известного как HDR10/BT.2100.

Этот параметр использует те же 32 бита на пиксель, что и традиционные форматы пикселей UINT8 SDR. Кроме того, на некоторых gpu это устраняет некоторую обработку, необходимую для преобразования содержимого в формат провода HDR10.

Использование цепочки расширенной цветовой замены при отображении в режиме SDR

Вы можете использовать цепочку расширенных цветов, даже если дисплей не поддерживает все возможности расширенного цвета. В таких случаях диспетчер окон рабочего стола (DWM) понизит содержимое, чтобы соответствовать возможностям дисплея, выполнив числовое вырезка. Например, если вы отрисовываете цепочку буферов scRGB FP16 и предназначено для стандартного дисплея, то все, что находится за пределами числового диапазона [0, 1], обрезается.

Это поведение внизу также возникает, если окно приложения перестраивание двух или более дисплеев с различными возможностями расширенного цвета. AdvancedColorInfo и IDXGIOutput6 абстрагируются для отчета только о характеристиках основного дисплея (главном , определяемом как отображение, содержащее центр окна).

Соответствие эталонного цвета приложения белому уровню ссылок НА ОС SDR

Примечание.

Ссылка на белый цвет применяется только к дисплеям HDR; Для отображения дополнительного цвета SDR (1.0, 1.0, 1.0) всегда означает максимальное белое светило, которое может воспроизвести дисплей.

Во многих сценариях приложение будет отображать содержимое SDR и HDR; например, отрисовка субтитров или элементов управления транспортом через видео HDR или пользовательский интерфейс в игровой сцене. Важно понимать концепцию ссылочного уровня SDR, чтобы убедиться, что содержимое SDR выглядит правильно на дисплее HDR. Эталонный белый цвет указывает яркость, при которой в сцене HDR отображается диффузный белый объект (например, лист бумаги или иногда пользовательский интерфейс). Так как значения цветов HDR имеют яркость со ссылкой на сцену, определенное значение цвета должно отображаться на абсолютном уровне яркости, а не относительно максимального возможного значения панели. Например, scRGB (1.0, 1.0, 1.0) и HDR10 (497, 497, 497) оба кодируют точно D65 белый на 80 нит светимости. Windows позволяет пользователю настроить уровень белого цвета ссылки на SDR на их предпочтения. Это светимость, по которому Windows будет отображать sRGB (1.0, 1.0, 1.0, 1.0) в. На настольных мониторах HDR значения SDR ссылаются на белые уровни обычно равны около 200 нит.

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

Примечание.

На дисплее, поддерживающем элемент управления яркостью, например на ноутбуке, Windows также настраивает освещение содержимого HDR (сцена, на которую ссылается), чтобы соответствовать требуемому уровню яркости пользователя, но это невидимо для приложения. Если вы не пытаетесь гарантировать точное воспроизведение сигнала HDR, вы, как правило, можете игнорировать это.

Если приложение всегда отображает SDR и HDR в отдельных поверхностях и зависит от композиции ОС, Windows автоматически выполняет правильную корректировку, чтобы повысить уровень содержимого SDR до требуемого белого уровня. Например, если приложение использует XAML и отрисовывает содержимое HDR в собственный SwapChainPanel.

Однако если ваше приложение выполняет собственную композицию содержимого SDR и HDR в одну поверхность, то вы несете ответственность за самостоятельное изменение ссылочного уровня SDR. В противном случае содержимое SDR может показаться слишком тусклым при типичных условиях просмотра рабочего стола. Сначала необходимо получить текущий уровень ссылки на SDR, а затем настроить значения цветов любого содержимого SDR, отрисовываемого вами.

Шаг 1. Получение текущего эталонного уровня SDR

Текущий уровень ссылки на SDR можно получить одним из следующих способов:

Шаг 2. Настройка значений цветов содержимого SDR

Windows определяет номинальное значение или значение по умолчанию, ссылающееся на белый уровень на 80 нит. Таким образом, если вы должны были отобразить стандартный sRGB (1.0, 1.0, 1.0) белый в цепочку буферов FP16, то он будет воспроизведен на 80 нит светимости. Чтобы соответствовать фактическому пользовательскому уровню ссылочного уровня, необходимо настроить содержимое SDR от 80 нит до уровня, указанного с помощью AdvancedColorInfo.SdrWhiteLevelInNits.

Если вы выполняете отрисовку с помощью FP16 и scRGB или любого цветового пространства, использующего линейную гамму (1.0), вы можете просто умножить значение цвета SDR на AdvancedColorInfo.SdrWhiteLevelInNits / 80. Если вы используете Direct2D, то есть предопределенная константная D2D1_SCENE_REFERRED_SDR_WHITE_LEVEL, которая имеет значение 80.

D2D1_VECTOR_4F inputColor; // Input SDR color value.
D2D1_VECTOR_4F outputColor; // Output color adjusted for SDR white level.
auto acInfo = ...; // Obtain an AdvancedColorInfo.

float sdrAdjust = acInfo->SdrWhiteLevelInNits / D2D1_SCENE_REFERRED_SDR_WHITE_LEVEL;

// Normally in DirectX, color values are manipulated in shaders on GPU textures.
// This example performs scaling on a CPU color value.
outputColor.r = inputColor.r * sdrAdjust; // Assumes linear gamma color values.
outputColor.g = inputColor.g * sdrAdjust;
outputColor.b = inputColor.b * sdrAdjust;
outputColor.a = inputColor.a;

Если вы выполняете отрисовку с помощью нелинейного гамма-цветового пространства, например HDR10, то более сложная настройка уровня SDR. Если вы пишете собственный шейдер пикселей, рассмотрите возможность преобразования в линейную гамму, чтобы применить корректировку.

Адаптация содержимого HDR к возможностям дисплея с помощью сопоставления тонов

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

Наиболее важным одним параметром для адаптации является максимальное освещение, также известное как MaxCLL (уровень освещения содержимого); более сложные тоновые карты также адаптируют минимальный свет (MinCLL) и /или цвет первичных элементов.

Шаг 1. Получение возможностей цветового тома дисплея

приложения универсальной платформы Windows (UWP);

Используйте AdvancedColorInfo , чтобы получить том цвета дисплея.

Приложения DirectX Win32 (desktop)

Используйте DXGI_OUTPUT_DESC1 для получения тома цвета дисплея.

Шаг 2. Получение сведений о цветовом томе содержимого

В зависимости от того, откуда поступило содержимое HDR, существует несколько возможных способов определения его яркости и цветовой гаммы информации. Некоторые файлы видео и изображений HDR содержат метаданные SMPTE ST.2086. Если содержимое было отрисовывается динамически, вы можете извлечь сведения о сцене из внутренних этапов отрисовки, например самый яркий источник света в сцене.

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

// Perform histogram pipeline setup; this should occur as part of image resource creation.
// Histogram results in no visual output but is used to calculate HDR metadata for the image.
void D2DAdvancedColorImagesRenderer::CreateHistogramResources()
{
    auto context = m_deviceResources->GetD2DDeviceContext();

    // We need to preprocess the image data before running the histogram.
    // 1. Spatial downscale to reduce the amount of processing needed.
    DX::ThrowIfFailed(
        context->CreateEffect(CLSID_D2D1Scale, &m_histogramPrescale)
        );

    DX::ThrowIfFailed(
        m_histogramPrescale->SetValue(D2D1_SCALE_PROP_SCALE, D2D1::Vector2F(0.5f, 0.5f))
        );

    // The right place to compute HDR metadata is after color management to the
    // image's native colorspace but before any tonemapping or adjustments for the display.
    m_histogramPrescale->SetInputEffect(0, m_colorManagementEffect.Get());

    // 2. Convert scRGB data into luminance (nits).
    // 3. Normalize color values. Histogram operates on [0-1] numeric range,
    //    while FP16 can go up to 65504 (5+ million nits).
    // Both steps are performed in the same color matrix.
    ComPtr<ID2D1Effect> histogramMatrix;
    DX::ThrowIfFailed(
        context->CreateEffect(CLSID_D2D1ColorMatrix, &histogramMatrix)
        );

    histogramMatrix->SetInputEffect(0, m_histogramPrescale.Get());

    float scale = sc_histMaxNits / sc_nominalRefWhite;

    D2D1_MATRIX_5X4_F rgbtoYnorm = D2D1::Matrix5x4F(
        0.2126f / scale, 0, 0, 0,
        0.7152f / scale, 0, 0, 0,
        0.0722f / scale, 0, 0, 0,
        0              , 0, 0, 1,
        0              , 0, 0, 0);
    // 1st column: [R] output, contains normalized Y (CIEXYZ).
    // 2nd column: [G] output, unused.
    // 3rd column: [B] output, unused.
    // 4th column: [A] output, alpha passthrough.
    // We explicitly calculate Y; this deviates from the CEA 861.3 definition of MaxCLL
    // which approximates luminance with max(R, G, B).

    DX::ThrowIfFailed(histogramMatrix->SetValue(D2D1_COLORMATRIX_PROP_COLOR_MATRIX, rgbtoYnorm));

    // 4. Apply a gamma to allocate more histogram bins to lower luminance levels.
    ComPtr<ID2D1Effect> histogramGamma;
    DX::ThrowIfFailed(
        context->CreateEffect(CLSID_D2D1GammaTransfer, &histogramGamma)
        );

    histogramGamma->SetInputEffect(0, histogramMatrix.Get());

    // Gamma function offers an acceptable tradeoff between simplicity and efficient bin allocation.
    // A more sophisticated pipeline would use a more perceptually linear function than gamma.
    DX::ThrowIfFailed(histogramGamma->SetValue(D2D1_GAMMATRANSFER_PROP_RED_EXPONENT, sc_histGamma));
    // All other channels are passthrough.
    DX::ThrowIfFailed(histogramGamma->SetValue(D2D1_GAMMATRANSFER_PROP_GREEN_DISABLE, TRUE));
    DX::ThrowIfFailed(histogramGamma->SetValue(D2D1_GAMMATRANSFER_PROP_BLUE_DISABLE, TRUE));
    DX::ThrowIfFailed(histogramGamma->SetValue(D2D1_GAMMATRANSFER_PROP_ALPHA_DISABLE, TRUE));

    // 5. Finally, the histogram itself.
    HRESULT hr = context->CreateEffect(CLSID_D2D1Histogram, &m_histogramEffect);
    
    if (hr == D2DERR_INSUFFICIENT_DEVICE_CAPABILITIES)
    {
        // The GPU doesn't support compute shaders and we can't run histogram on it.
        m_isComputeSupported = false;
    }
    else
    {
        DX::ThrowIfFailed(hr);
        m_isComputeSupported = true;

        DX::ThrowIfFailed(m_histogramEffect->SetValue(D2D1_HISTOGRAM_PROP_NUM_BINS, sc_histNumBins));

        m_histogramEffect->SetInputEffect(0, histogramGamma.Get());
    }
}

// Uses a histogram to compute a modified version of MaxCLL (ST.2086 max content light level).
// Performs Begin/EndDraw on the D2D context.
void D2DAdvancedColorImagesRenderer::ComputeHdrMetadata()
{
    // Initialize with a sentinel value.
    m_maxCLL = -1.0f;

    // MaxCLL is not meaningful for SDR or WCG images.
    if ((!m_isComputeSupported) ||
        (m_imageInfo.imageKind != AdvancedColorKind::HighDynamicRange))
    {
        return;
    }

    // MaxCLL is nominally calculated for the single brightest pixel in a frame.
    // But we take a slightly more conservative definition that takes the 99.99th percentile
    // to account for extreme outliers in the image.
    float maxCLLPercent = 0.9999f;

    auto ctx = m_deviceResources->GetD2DDeviceContext();

    ctx->BeginDraw();

    ctx->DrawImage(m_histogramEffect.Get());

    // We ignore D2DERR_RECREATE_TARGET here. This error indicates that the device
    // is lost. It will be handled during the next call to Present.
    HRESULT hr = ctx->EndDraw();
    if (hr != D2DERR_RECREATE_TARGET)
    {
        DX::ThrowIfFailed(hr);
    }

    float *histogramData = new float[sc_histNumBins];
    DX::ThrowIfFailed(
        m_histogramEffect->GetValue(D2D1_HISTOGRAM_PROP_HISTOGRAM_OUTPUT,
            reinterpret_cast<BYTE*>(histogramData),
            sc_histNumBins * sizeof(float)
            )
        );

    unsigned int maxCLLbin = 0;
    float runningSum = 0.0f; // Cumulative sum of values in histogram is 1.0.
    for (int i = sc_histNumBins - 1; i >= 0; i--)
    {
        runningSum += histogramData[i];
        maxCLLbin = i;

        if (runningSum >= 1.0f - maxCLLPercent)
        {
            break;
        }
    }

    float binNorm = static_cast<float>(maxCLLbin) / static_cast<float>(sc_histNumBins);
    m_maxCLL = powf(binNorm, 1 / sc_histGamma) * sc_histMaxNits;

    // Some drivers have a bug where histogram will always return 0. Treat this as unknown.
    m_maxCLL = (m_maxCLL == 0.0f) ? -1.0f : m_maxCLL;
}

Шаг 3. Выполнение операции тонации HDR

Тонмапинг по сути является процессом потери и может быть оптимизирован для ряда метрики перцептуальных или целевых показателей, поэтому нет единого стандартного алгоритма. Windows предоставляет встроенный эффект тонмапер HDR как часть Direct2D, а также в конвейере воспроизведения видео в Media Foundation HDR. Некоторые другие часто используемые алгоритмы включают ACES Filmic, Reinhard и ITU-R BT.2390-3 EETF (функция электрической передачи).

В следующем примере кода показан упрощенный оператор тонмапера Рейнхарда.

// This example uses C++. A typical DirectX implementation would port this to HLSL.
D2D1_VECTOR_4F simpleReinhardTonemapper(
    float inputMax, // Content's maximum luminance in scRGB values, e.g. 1.0 = 80 nits.
    float outputMax, // Display's maximum luminance in scRGB values, e.g. 1.0 = 80 nits.
    D2D1_VECTOR_4F input // scRGB color.
)
{
    D2D1_VECTOR_4F output = input;

    // Vanilla Reinhard normalizes color values to [0, 1].
    // This modification scales to the luminance range of the display.
    output.r /= inputMax;
    output.g /= inputMax;
    output.b /= inputMax;

    output.r = output.r / (1 + output.r);
    output.g = output.g / (1 + output.g);
    output.b = output.b / (1 + output.b);

    output.r *= outputMax;
    output.g *= outputMax;
    output.b *= outputMax;

    return output;
}

Запись содержимого экрана HDR и WCG

API, поддерживающие указание форматов пикселей, таких как в пространстве имен Windows.Graphics.Capture, и метод IDXGIOutput5::D uplicateOutput1, предоставляют возможность записи содержимого HDR и WCG без потери сведений о пикселях. Обратите внимание, что после получения кадров содержимого требуется дополнительная обработка. Например, сопоставление тонов HDR с SDR (например, копирование снимка экрана SDR для общего доступа к Интернету) и сохранение содержимого с правильным форматом (например, JPEG XR).

Изменения в устаревшем управлении цветами и поведении профиля ICC

Расширенное управление цветами и автоматическое управление цветами обеспечивает согласованность и точную цветовую метрику для всех приложений, устаревших и современных. Однако некоторые приложения могут выполнять собственное явное управление цветами с помощью профилей цветов международного консорциума цветов (ICC).

Если расширенный цвет активен на экране SDR или HDR, поведение профилей отображения ICC изменяется в способах, не совместимых с обратной стороной. Если приложение работает с профилями ICC, Windows предлагает вспомогательные средства совместимости, чтобы обеспечить правильное поведение приложения.

Дополнительные сведения об изменениях в поведении профиля ICC и о том, как адаптировать приложение для обеспечения максимальной совместимости с расширенным цветом, см. в статье о поведении профиля ICC с расширенным цветом.

Дополнительные ресурсы

  • На сайте GitHub с помощью отрисовки HDR с пакетом инструментов DirectX для DirectX 11 / DirectX 12. Пошаговое руководство по добавлению поддержки HDR в приложение DirectX с помощью пакета инструментов DirectX (DirectXTK).
  • Пример приложения для отрисовки изображений с расширенным цветом Direct2D. Пример приложения пакета SDK UWP, реализующего hdR и средство просмотра образов WCG с поддержкой расширенного цвета с помощью Direct2D. Демонстрирует полный спектр рекомендаций для приложений UWP, включая реагирование на изменения возможностей и настройку уровня белого уровня SDR.
  • Пример классического приложения Direct3D 12 HDR. Пример пакета SDK для настольных компьютеров, реализующий базовую сцену HDR Direct3D 12.
  • Пример приложения UWP direct3D 12 HDR. Эквивалент UWP приведенного выше примера.
  • SimpleHDR_PC. Пример приложения Xbox ATG SimpleHDR (классическое приложение) с базовой сценой Direct3D 11 HDR.