Использование 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 порядков величины света; Человеческий глаз может различить еще больший диапазон после адаптации.
С момента Direct3D 9 графические подсистемы смогли внутренне отрисовать свои сцены с таким уровнем физической точности. Однако типичный дисплей со стандартным динамическим диапазоном может воспроизводить только чуть более 3 порядка светимости, и поэтому любой HDR-контент должен быть тоноперекодирован в ограниченный диапазон дисплея. Новые HDR-дисплеи, включая те, которые соответствуют стандарту HDR10 (BT.2100), преодолевают это ограничение; например, высококачественные самосветящиеся дисплеи могут достичь более чем 6 порядков величины.
Широкая цветовая гамма
Цветовая гамма относится к диапазону и насыщенности оттенков, которые может воспроизвести дисплей. Самые насыщенные естественные цвета, которые может воспринимать человеческий глаз, состоят из чистого монохроматического света, такого как свет, производимый лазерами. Однако массовые потребительские дисплеи часто могут воспроизводить цвета только в гамме sRGB, что составляет лишь около 35% всех цветов, доступных для человеческого восприятия. На схеме ниже представлено представление человеческого "спектрального локуса", или всех доступных цветов (на заданном уровне света), где меньший треугольник является гаммой SRGB.
Высококлассные профессиональные экраны ПК долгое время поддерживают цветовые гаммы, которые значительно шире, чем sRGB, такие как Adobe RGB и DCI-P3, охватывающие около половины всех человеческих воспринимаемых цветов. И эти дисплеи с широким цветовым охватом становятся все более распространенными.
Автоматическое управление цветами системы
Управление цветами — это технология и практика обеспечения точного и согласованного воспроизведения цветов на разных устройствах. Если вы являетесь создателем цифрового контента, очень важно, чтобы цвета в вашем визуальном контенте, такие как фотографии, изображения продукта или логотипа, появлялись на вашем дисплее так же, как и на разнообразных цифровых устройствах вашей аудитории.
Windows предоставляет API-интерфейсы управления цветами с Windows 2000 с помощью API управления цветами изображений (ICM) и более поздних версий API системы цветов Windows (WCS ). Тем не менее эти API были вспомогательными только для тех приложений, которые хотели или им нужно было управлять цветом, тогда как большинство приложений и цифрового содержимого по умолчанию используют стандартное цветовое пространство sRGB и никогда не управлялись цветовым управлением операционной системы. Это было разумным предположением в прошлом, но высококачественные дисплеи с широкой цветовой гаммой становятся гораздо более распространёнными.
Новые версии Windows поддерживают автоматическое управление цветами системы; это гарантирует, что все цвета в каждом приложении Windows, независимо от того, являются ли они цветообразующими, отображаются точно и согласованно на каждом поддерживаемом дисплее.
Примечание.
Автоматическое управление цветом не является характеристикой аппаратного обеспечения дисплея. Вместо этого это функция Windows для корректной поддержки дисплеев с большей цветовой гаммой, чем sRGB.
Глубокая точность / битовая глубина
Числовая точность или глубина бита относится к объему информации, используемой для уникального определения цветов. Более высокая глубина цветности означает, что можно различать очень похожие цвета без артефактов, таких как полосатость. Основной компьютер отображает 8 бит на канал цвета, в то время как человеческий глаз требует по крайней мере 10-12 бит точности, чтобы избежать воспринимаемых искажений.
До внедрения расширенного цвета диспетчер окон рабочего стола (DWM) ограничивал оконные приложения выводить содержимое с использованием только 8 бит на канал цвета, даже если дисплей поддерживал большую глубину цвета. Если включен расширенный цвет, DWM выполняет свою композицию с помощью числа с плавающей запятой половинной точности (FP16) согласно стандарту IEEE, устраняя все узкие места и позволяя использовать полную точность дисплея.
Архитектура расширенной цветовой системы Windows
Сведения в этом разделе являются необязательными для создания приложений с расширенными цветовыми возможностями, но полезно будет понять, как работает технология, чтобы оптимизировать отрисовку и поведение приложения.
В этом разделе мы будем использовать упрощенную схему для описания соответствующих компонентов графического стека Windows:
Существующие окна: 8-разрядные или sRGB-экраны
В течение десятилетий потребительские экраны и графическая подсистема Windows были основаны на 8-битных на канал (24-битных на пиксель) содержимом sRGB. Приложения, использующие графические API, такие как DirectX, могут выполнять внутреннюю отрисовку с помощью больших битовых глубин и расширенных цветовых пространств; Однако ОС поддерживает только 8-разрядное целое число с неявным sRGB и без системного управления цветами:
Это означает, что при отображении все дополнительные данные цвета, отображаемые приложением, будут потеряны; и что приложению пришлось самостоятельно выполнять управление цветами, чтобы обеспечить точное воспроизведение на дисплее.
Windows 10, версия 1703: HDR-дисплеи с расширенным цветовым диапазоном
Windows 10 версии 1703 представила первую версию возможностей расширенного цвета для дисплеев HDR. Это потребовало нескольких значительных достижений в графическом стеке ОС:
- Поддержка сигнализации HDR для дисплеев
- Системная композиция с использованием большой глубины цвета и стандартного цветового пространства
- Автоматическое управление цветами системы
Каждый прогресс рассматривается в подразделах ниже. Конечный результат в том, что расширенные данные о цветах приложений теперь правильно сохраняются ОС и точно воспроизводятся на дисплеях HDR.
Поддержка сигнальной передачи на дисплеях с HDR
HDR сигнализация через соединители отображения, такие как DisplayPort и HDMI, в основном использует точность 10 бит на канал (или больше) и цветовое пространство ST.2084 в спецификации BT.2100. Ядро дисплея, драйвер отображения и базовое оборудование 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 выполняет операции управления цветами на двух этапах:
- DWM преобразует каждое приложение из собственного цветового пространства в CCCS перед смешиванием.
- Ядро дисплея преобразует фреймбаффер ОС из CCCS в цветовое пространство формата провода (BT.2100 ST.2084).
- При необходимости ядро дисплея работает с драйвером дисплея для выполнения дополнительной калибровки цвета дисплея; Дополнительные сведения см. в статье о конвейере калибровки цветов в оборудовании Windows.
Примечание.
На обоих этапах операция управления цветом состоит из преобразования цветового пространства (матрица и 1DLUT). Цвета, превышающие целевую цветовую гамму дисплея, численно обрезаются.
Windows 11 версии 22H2: SDR дисплеи с расширенными цветами
Хотя распространенность дисплеев HDR быстро растет, мониторы SDR останутся важными на протяжении многих лет. Поддержка HDR в Windows 10 версии 1703 заложила большую часть основы, необходимой для улучшения отображения SDR. Windows 11 версии 22H2 расширяет возможности расширенного цвета и автоматического управления цветами до определённых совместимых дисплеев SDR. Диаграмма графического блока для расширенного цвета SDR выглядит очень похоже на HDR:
Поддержка отображения сигналов 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 Radeon RX 400 серии (Polaris) или новее
- Серия NVIDIA GeForce 10 (Pascal) или более новая
- Выбранный Intel Core 10-го поколения (Ice Lake) или более поздней версии*
Примечание.
Наборы микросхем, кодовое название Intel 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 Runtime 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 становится ложным; и воссоздание цепочки обмена для получения текущих выходных данных приводит к временному черному экрану. Вместо этого рекомендуется перечислить границы всех выходных данных DXGI и определить, какой из них имеет наибольшее пересечение с границами окна приложения.
Следующий пример кода взят из приложения-примера Direct3D 12 HDR на 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, ¤tOutput) != 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|Composition|CoreWindow], необходимо использовать модель переворота DXGI, выбрав параметр DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL или DXGI_SWAP_EFFECT_FLIP_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, например видеопроигрыватель, или если оно в основном будет использоваться в полноэкранных сценариях, таких как игра. При создании swap chain следует указать 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; для дисплеев Advanced Color 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). На настольных мониторах HDR опорные уровни белого SDR обычно установлены на уровне около 200 нит.
Ваше приложение HDR должно разрешить пользователю задать нужный уровень белого цвета или прочитать значение, настроенное системой. Вы должны сопоставить значения рассеянного белого цвета в сцене с эталонным уровнем белого цвета SDR. Это влечет за собой умножение кадрового буфера приложения в линейном гамма-пространстве.
Примечание.
На дисплее, поддерживающем элемент управления яркостью, например на ноутбуке, Windows также настраивает освещение содержимого HDR (сцена, на которую ссылается), чтобы соответствовать требуемому уровню яркости пользователя, но это невидимо для приложения. Если вы не пытаетесь гарантировать точное воспроизведение сигнала HDR, вы, как правило, можете игнорировать это.
Если приложение всегда отображает SDR и HDR в отдельных поверхностях и зависит от композиции ОС, Windows автоматически выполняет правильную корректировку, чтобы повысить уровень содержимого SDR до требуемого белого уровня. Например, если приложение использует XAML и отрисовывает HDR-контент в собственный SwapChainPanel.
Однако, если ваше приложение самостоятельно осуществляет композицию содержимого SDR и HDR в одну поверхность, то вы несете ответственность за самостоятельную настройку уровня белого для SDR. В противном случае содержимое SDR может показаться слишком тусклым при типичных условиях просмотра рабочего стола. Сначала необходимо получить текущий опорный белый уровень для SDR, а затем откорректировать значения цветов любого SDR-контента, который вы отображаете.
Шаг 1. Получение текущего эталонного белого уровня SDR
Текущий опорный белый уровень SDR можно получить одним из следующих способов.
- В настольном приложении. DISPLAYCONFIG_SDR_WHITE_LEVEL и QueryDisplayConfig.
- В приложении UWP. AdvancedColorInfo.SdrWhiteLevelInNits (с использованием CoreWindow).
Шаг 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 и в конвейере воспроизведения HDR-видео в Media Foundation. Некоторые другие часто используемые алгоритмы включают 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::DuplicateOutput1, предоставляют возможность захвата контента 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. Пример приложения UWP SDK, реализующего средство просмотра изображений с поддержкой 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.