Использование гамма-коррекции

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

Что такое гамма и что это за?

В конце графического конвейера, где изображение покидает компьютер, чтобы сделать свой путь вдоль кабеля монитора, есть небольшой фрагмент оборудования, который может преобразовывать значения пикселей на лету. Обычно это оборудование использует таблицу подстановки для преобразования пикселей. Это оборудование использует красные, зеленые и синие значения, поступающие из поверхности, для отображения для поиска гамма-исправленных значений в таблице, а затем отправляет исправленные значения монитору вместо фактических значений поверхности. Таким образом, эта таблица подстановки позволяет заменить любой цвет любым другим цветом. Хотя таблица имеет этот уровень мощности, типичное использование заключается в том, чтобы настроить изображения, чтобы компенсировать различия в ответе монитора. Ответ монитора — это функция, которая связывает числовое значение красных, зеленых и синих компонентов пикселя с отображаемой яркостью этого пикселя.

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

Наука о определении гамма-коррекции сложна и не представлена здесь, кроме того, чтобы освещать, откуда пришло название "гамма". Ответ монитора CRT (то есть старомодного стекла) является сложной функцией, но физика этих мониторов означает, что они демонстрируют ответ, который может быть грубо представлен этой функцией власти:

brightness( input ) = inputgamma

Гамма-значение обычно близко к значению 2,0. МОНИТОРы и все другие новые технологии специально спроектированы для того, чтобы продемонстрировать аналогичный ответ, поэтому все наши программное обеспечение и изображения не должны быть перекалибированы для этих новых технологий. Стандарт sRGB объявляет, что это гамма-значение ровно 2,2, и это значение стало широко реализуемым стандартом.

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

Поскольку гамма-значение 2,2 стало де-факто стандартом, нам обычно не нужно беспокоиться слишком много о гамма-кривой, закодированной в этой таблице, и может оставить его как линейное, одно к одному сопоставлению. Правильное сопоставление цветов, конечно, требует изысканный уход с этой функцией, но это обсуждение выходит за рамки этой темы. Windows включает средство, которое позволяет пользователям откалибрировать их отображение до гамма-2.2, и это средство использует оборудование таблицы подстановки для получения тщательно выбранной тонкой настройки для своих компьютеров. Пользователи могут запустить это средство, выполнив поиск по запросу "calibrate color". Существуют также четко определенные цветовые профили для определенных мониторов, которые автоматизируют этот процесс. Средство "калибровка цвета" может обнаруживать эти новые мониторы и уведомлять пользователей о том, что калибровка уже выполняется.

Это понятие кодирования права власти на значения цвета также полезно в других местах графического конвейера, особенно в текстурах. Для текстур, вы хотите больше точности на темных цветах из-за логарифмической реакции человеческого глаза мы только что говорили. Важно тщательное обработка гамма-гамма в этой части конвейера. Дополнительные сведения см. в разделе "Преобразование данных" для цветового пространства.

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

Фон гамма на Windows

Windows компьютерах обычно есть гамма-таблица, которая является таблицей подстановки, которая принимает триплет байтов и выводит триплет байтов. Эти триплеты — 768 (256 x 3) байт ОЗУ. Это нормально, если формат отображения содержит триплет значений RGB BYTE, но не достаточно выразителен, чтобы описать преобразования, которые могут потребоваться, если формат отображения имеет более широкий диапазон, чем [0,1], например значения с плавающей запятой. API в Windows, которые управляют гамма-гаммой, последовали эволюции, так как форматы отображения стали более сложными.

Первые Windows API, которые предлагают гамма-управление, — это Windows Интерфейс графических устройств (GDI) SetDeviceGammaRamp и GetDeviceGammaRamp. Эти API работают с тремя массивами WORD с тремя массивами 256 записей, каждый кодирование WORD равно нулю до одного, представленным значениями WORD 0 и 65535. Дополнительная точность WORD обычно недоступна в фактических таблицах подстановки оборудования, но эти API должны были быть гибкими. Эти API- интерфейсы, в отличие от других, описанных далее в этом разделе, допускают только небольшое отклонение от функции идентификации. Фактически любая запись в рампе должна находиться в пределах 32768 значения удостоверения. Это ограничение означает, что приложение не может полностью черное отображение или какой-либо другой непрочитаемый цвет.

Следующий API — SetGammaRamp Microsoft Direct3D 9, который соответствует тому же шаблону и формату данных, что и SetDeviceGammaRamp. Значение по умолчанию гамма-пандуса Direct3D 9 не особенно полезно; это пандус WORD, инициализированный до 0-255, а не 0-65535, даже если API определен с точки зрения 0-65535.

Последний API — IDXGIOutput::SetGammaControl. Этот API имеет более гибкую схему для выражения гамма-управления, так как для расширенного набора форматов отображения DXGI, включая десять целых битов на канал, 16-разрядные форматы с плавающей запятой и расширенный формат диапазона XR_BIAS.

Все эти API работают на одном оборудовании и изменяют одинаковые значения. API Direct3D 9 и DXGI являются "только записью". Вы не можете считывать значение оборудования, изменять его и устанавливать. Вы можете установить только рампу. Кроме того, вы можете задать гамма только в полноэкранном режиме приложения. Это ограничение является еще одним способом гарантировать, что рабочий стол всегда доступен для чтения. То есть приложение может нарушить собственное отображение, но Windows восстановит предыдущую гамма-пандус, когда приложение теряет весь экран (например, с помощью alt-tab или ctrl-alt-del).

Эволюция оборудования дисплея

Некоторые более новые мониторы могут отображать широкий диапазон интенсивности. Но если формат отображения может представлять только значения от нуля до одного, дисплей должен сопоставлять ноль с самым темным значением и одним с самым ярким значением. Это самое яркое значение может быть слишком ярким для удобного просмотра веб-страниц с черным текстом на белом фоне, но замечательно для чрезмерно ярких специальных эффектов, таких как просмотр солнечного света блеск от озера или молнии разветвления неба. Таким образом, нам нужен способ выразить эти более широкие диапазоны. DXGI 1.1 и более поздних версий содержит значения формата отображения, которые позволяют 1.0 представлять удобное белое значение и резервирует более широкие значения формата отображения для более ярких специальных эффектов. DXGI 1.1 поддерживает два формата отображения, которые могут выразить эти более широкие значения: DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM и 16-разрядную плавающую точку. Полное обсуждение этих форматов см. в разделе "Подробные сведения о расширенном формате". Далее мы рассмотрим, почему IDXGI IDXGIOutput::SetGammaControl гамма API требует значения пикселей больше 1,0.

Возможности гамма-управления в DXGI

DXGI позволяет драйверу отображения выразить свои гамма-элементы управления в виде пошаговой линейной функции. Эта пошаговая линейная функция определяется контрольными точками этой функции, диапазоном значений, в которые может быть преобразована функция, и дополнительной дополнительной операцией масштабирования и смещения, которую можно применить после преобразования. Приложение может вызвать метод IDXGIOutput::GetGammaControlCapabilities , чтобы получить все эти возможности управления в структуре DXGI_GAMMA_CONTROL_CAPABILITIES .

На этом графике показана линейная функция с четырьмя контрольными точками.

gamma correction linear function

DXGI определяет контрольные точки по их расположению вдоль оси цвета поверхности. На предыдущем графике расположения контрольных точек — 0, 0,5, 0,75 и 1.0. Эти контрольные точки указывают, что оборудование может преобразовывать значения в диапазоне от 0 до 1,0. DXGI перечисляет эти контрольные точки в элементе массива ControlPointPositionsDXGI_GAMMA_CONTROL_CAPABILITIES и всегда объявляет их в порядке увеличения. DXGI заполняет только первые элементы массива ControlPointPositions и указывает количество элементов элементом NumGammaControlPointsDXGI_GAMMA_CONTROL_CAPABILITIES. Если NumGammaControlPoints меньше 1025, DXGI оставляет остальные элементы ControlPointPositions неопределенными.

Оборудование, представленное этим графом, может преобразовывать значения в диапазон от 0 до 1,25. Таким образом, DXGI устанавливает для элементов MinConvertedValue и MaxConvertedValue значение 0,0f и 1.25f соответственно.

DXGI задает элемент ScaleAndOffsetSupportedDXGI_GAMMA_CONTROL_CAPABILITIES , чтобы указать, поддерживает ли оборудование возможность масштабирования и смещения. Если оборудование поддерживает масштабирование и смещение, она сохраняет простую таблицу подстановки "один к одному", но затем настраивает выходные данные таблицы, чтобы растянуть выходные данные до диапазона больше [0,1]. Оборудование сначала масштабирует значения, поступающие из таблицы подстановки, а затем смещает их.

Примечание

Разные мониторы, подключенные к одному компьютеру, могут иметь разные возможности гамма-управления. Кроме того, возможности гамма-управления могут фактически изменяться в зависимости от режима отображения выходных данных. Следовательно, мы рекомендуем всегда вызывать IDXGIOutput::GetGammaControlCapabilities для запроса возможностей гамма-управления после того, как приложение переходит в полноэкранный режим.

 

Эти значения возможностей гамма-управления можно использовать для получения значений элементов управления, которые затем можно задать с помощью API IDXGIOutput::SetGammaControl .

Настройка гамма-элемента управления с помощью DXGI

Чтобы задать гамма-элементы управления, передайте указатель на структуру DXGI_GAMMA_CONTROL при вызове API IDXGIOutput::SetGammaControl .

Элементы DXGI_GAMMA_CONTROL масштабирования и смещения задают значения шкалы и смещения, которые необходимо применить к значениям, полученным из таблицы подстановки. Вы можете безопасно задать для параметра Scale значение 1 и Offset равным нулю (т. е. масштабирование по одному не влияет, а смещение нуля не имеет эффекта), если вы не хотите использовать возможность масштабирования и смещения или если оборудование не имеет такой возможности.

Для элемента массива ГаммаКурсв DXGI_GAMMA_CONTROL необходимо задать список структур DXGI_RGB для точек на гамма-кривой. Каждый элемент DXGI_RGB задает значения с плавающей запятой, представляющие красные, зеленые и синие компоненты для этой точки. Гамма-кривая не использует альфа-значения. Вы используете число, полученное из NumGammaControlPointsDXGI_GAMMA_CONTROL_CAPABILITIES для заполнения этого числа элементов в массиве GammaCurve . Каждый элемент, который вы размещаете в массиве GammaCurve , является высотой для каждой контрольной точки.

Обратите внимание, что на приведенном выше графике теперь у вас есть контроль над вертикальным размещением каждой контрольной точки, и у вас есть отдельный элемент управления для красного, зеленого и синего. Например, можно задать для всех зеленых и синих значений ноль и задать красные значения по лестнице по возрастанию от нуля до единицы. В этом сценарии отображаемое изображение отображает только красные части, а синий и зеленый — черным. Вы также можете установить спускающуюся лестницу для всех цветов, что приводит к инвертированию дисплея. Любое значение, которое вы размещаете в массиве GammaCurve , должно быть включено в значения, полученные из элементов MinConvertedValue и MaxConvertedValueDXGI_GAMMA_CONTROL_CAPABILITIES.

Практические возможности управления гамма-гамма

Гамма-элементы управления DXGI применяются только в полноэкранном режиме приложения. Windows восстанавливает предыдущее состояние дисплея при выходе приложения или возвращении в режим окон. Но Windows не восстанавливает гамма-состояние приложения, если приложение повторно переходит в полноэкранный режим. Приложение должно явно восстановить свое гамма-состояние при повторном входе в полноэкранный режим.

Не все адаптеры поддерживают гамма-управление. Если адаптер не поддерживает гамма-управление, он игнорирует вызовы для установки гамма-пандуса.

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

Курсор мыши, если он реализован в оборудовании (как и большинство из них), обычно не реагирует на гамма-параметр.

Руководство по программированию для DXGI