Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Гамма-коррекция, или сокращенно гамма, — это название нелинейной операции, которая используется для кодирования и декодирования значений пикселей в изображениях.
- Что такое гамма и что это за?
- Фон гаммы в Windows
- Эволюция оборудования отображения
- возможности управления гамма в DXGI
- Настройка гамма-управления с помощью DXGI
- Практические аспекты гамма-контроля
- Связанные темы
Что такое гамма и что это за?
В конце графического конвейера, где изображение покидает компьютер, проходя по кабелю монитора, находится маленькое аппаратное устройство, которое может преобразовывать значения пикселей на лету. Обычно это оборудование использует таблицу подстановки для преобразования пикселей. Это оборудование использует красные, зеленые и синие значения, поступающие с поверхности, для поиска значений с гамма-коррекцией в таблице, а затем отправляет скорректированные значения монитору вместо фактических значений поверхности. Таким образом, эта таблица подстановки предоставляет возможность заменить любой цвет на любой другой. Хотя таблица имеет такую степень мощности, типичное использование заключается в том, чтобы тонко настраивать изображения для компенсации различий в характеристиках монитора. Ответ монитора — это функция, которая связана с числовым значением красных, зеленых и синих компонентов пикселя с отображаемой яркостью этого пикселя.
Эта таблица была предназначена именно для этого, но разработчики игр нашли для неё творческое применение, например, мигание всего экрана красным для психологического эффекта. В современных игровых приложениях, как часть постобработки каждого кадра, мы обычно предоставляем другие способы выполнения таких задач. На самом деле, мы рекомендуем не трогать гамма-таблицу, потому что она может использоваться для калибровки реакции монитора, и существенные изменения в гамма-кривой уничтожат эту тщательную калибровку.
Наука об определении гамма-коррекции сложна и не представлена здесь, кроме того, чтобы осветить, откуда произошло название "гамма". Ответ монитора CRT (то есть старомодного стеклянного) является сложной функцией, но физика этих мониторов означает, что они демонстрируют ответ, который может быть грубо представлен этой степенной функцией.
яркость(вход) = входгамма
Гамма-значение обычно близко к значению 2,0. Мониторы LCD и все другие новые технологии специально спроектированы таким образом, чтобы демонстрировать аналогичный отклик, поэтому все наше программное обеспечение и изображения не должны быть перенастроены для этих новых технологий. Стандарт sRGB объявляет, что это гамма-значение ровно 2,2, и это значение стало широко реализованным стандартом.
Человеческий глаз также имеет функцию отклика, которая приблизительно инвертирует функцию питания CRT. Это означает, что воспринимаемая яркость пикселя приблизительно пропорциональна его значениям RGB.
Поскольку гамма-значение 2.2 стало де-факто стандартом, нам обычно не нужно слишком много беспокоиться о гамма-кривой, закодированной в этой таблице, и мы можем оставить его как линейное, одно-к-одному соответствие. Правильное согласование цветов, конечно, требует тщательного подхода при выполнении этой функции, но это обсуждение выходит за рамки этой темы. Windows включает в себя утилиту, которая позволяет пользователям калибровать свои дисплеи до гамма 2.2, и эта утилита использует аппаратное обеспечение таблицы подстановки, чтобы получить тщательно выбранную тонкую настройку для своих компьютеров. Пользователи могут запустить это средство, выполнив поиск по фразе "калибровка цвета". Существуют также четко определенные профили цветов для определенных мониторов, которые автоматизируют этот процесс. Средство "калибровка цвета" может обнаруживать эти новые мониторы и информировать пользователей о том, что калибровка уже выполняется.
Эта концепция кодирования степенного закона в значения цвета также полезна в других аспектах графического процесса, особенно в текстурах. Для текстур вам необходима большая точность в темных цветах из-за логарифмического отклика человеческого глаза, о котором мы только что говорили. В этой части потока важна внимательная обработка гаммы. Дополнительные сведения см. в разделе Преобразование данных для цветового пространства.
Оставшаяся часть этого раздела посвящена только гамма-коррекции в последней части конвейера между данными буфера кадра и монитором. Если вы хотите написать мастер калибровки или создать специальные эффекты в полноэкранном приложении, где шаг после обработки не является практическим, вот необходимые сведения.
Фон гамма в Windows
Компьютеры Windows обычно имеют гамма-кривую, которая представляет собой таблицу подстановки, принимающую триплет байтов и выводящую триплет байтов. Эти триплеты — 768 (256 x 3) байтов ОЗУ. Это хорошо, если формат отображения содержит триплет значений RGB BYTE, но не является достаточно экспрессивным, чтобы описать преобразования, которые могут потребоваться, если формат отображения имеет более широкий диапазон, чем [0,1], например значения с плавающей запятой. API Windows, которые управляют гаммой, эволюционировали по мере того как форматы отображения усложнялись.
Первый API Windows, предоставляющий управление гаммой, — это Graphics Device Interface (GDI) с функциями SetDeviceGammaRamp и GetDeviceGammaRamp. Эти API работают с тремя массивами по 256 элементов WORD, с каждым WORD, кодирующим значение от нуля до одного, представленным значениями WORD 0 и 65535. Дополнительная точность "WORD" обычно недоступна в аппаратных таблицах поиска, но эти API задумывались как гибкие. Эти API, в отличие от других описанных далее в этом разделе, позволяют только небольшое отклонение от функции идентификации. На самом деле любая запись в пандусе должна находиться в пределах 32768 значения удостоверения. Это ограничение означает, что ни одно приложение не может сделать отображение полностью черным или каким-либо другим непрочитаемым цветом.
Следующий API — это Microsoft Direct3D 9 SetGammaRamp, который повторяет тот же образец и формат данных, что и 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-разрядную плавающую точку. Полное обсуждение этих форматов см. Сведения о расширенном формате. Далее мы рассмотрим, почему gamma-API IDXGIOutput::SetGammaControl требует значений пикселей больше 1.0.
Возможности управления гаммой в DXGI
DXGI позволяет драйверу отображения задать параметры гаммы в виде пошаговой линейной функции. Эта пошаговая линейная функция определяется точками управления этой функции, диапазоном значений, в которые может быть преобразована функция, и дополнительной дополнительной операцией масштабирования и смещения, которую можно применить после преобразования. Приложение может вызывать метод IDXGIOutput::GetGammaControlCapabilities, чтобы получить все эти возможности управления в структуре DXGI_GAMMA_CONTROL_CAPABILITIES.
На этом графике показана линейная функция с четырьмя контрольными точками.
DXGI определяет контрольные точки по их расположению вдоль оси цвета поверхности. На предыдущем графике расположения контрольных точек — 0, 0,5, 0,75 и 1.0. Эти контрольные точки указывают, что оборудование может преобразовывать значения в диапазоне от 0 до 1.0. DXGI перечисляет эти контрольные точки в элементе ControlPointPositions массива DXGI_GAMMA_CONTROL_CAPABILITIES и всегда объявляет их в растущем порядке. DXGI заполняет только первые элементы массива ControlPointPositions, а количество элементов указывает с помощью члена NumGammaControlPoints из DXGI_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, чтобы указать значения масштабирования и смещения, которые вы хотите, чтобы аппаратное обеспечение применило к значениям, полученным из таблицы подстановки. Вы можете безопасно задать для масштабирования значение 1 и Смещение равным нулю (т. е. масштабирование по одному не имеет эффекта, а смещение нуля не имеет эффекта), если вы не хотите использовать возможность масштабирования и смещения или если оборудование не имеет такой возможности.
Вы задаете член массива ГаммаКривая в DXGI_GAMMA_CONTROL в список структур DXGI_RGB для точек на гамма-кривой. Каждый элемент DXGI_RGB задает значения с плавающей запятой, представляющие красные, зеленые и синие компоненты для этой точки. Гамма-кривая не использует альфа-значения. Вы используете число, полученное из NumGammaControlPoints в DXGI_GAMMA_CONTROL_CAPABILITIES, чтобы заполнить соответствующее количество элементов в массиве GammaCurve. Каждый элемент в массиве GammaCurve определяет высоту для каждой контрольной точки.
Обратите внимание, что на приведенном выше графике теперь у вас есть контроль над вертикальным размещением каждой контрольной точки и есть отдельный элемент управления для красного, зеленого и синего. Например, можно задать для всех зеленых и синих значений нулевое значение и установить красные значения на лестницу по возрастанию от нуля до одного. В этом сценарии изображение отображает только красные части, а синий и зеленый появляются как черные. Вы также можете задать нисходяющую лестницу для всех цветов, что приводит к инвернутому отображению. Любое значение, размещенное в массиве GammaCurve, должно включаться в диапазон значений, полученных из членов MinConvertedValue и MaxConvertedValue структуры DXGI_GAMMA_CONTROL_CAPABILITIES.
Практические аспекты управления гамма-излучением
Элементы управления гаммой DXGI применяются только, когда приложение находится в полноэкранном режиме. Windows восстанавливает предыдущее состояние отображения при выходе приложения или возвращении в окно. Но Windows не восстанавливает гамма-состояние приложения, если приложение повторно входит в полноэкранный режим. Приложение должно явно восстановить его гамма-состояние при повторном вводе полноэкранного режима.
Не все адаптеры поддерживают гамма-управление. Если адаптер не поддерживает гамма-управление, он игнорирует вызовы на установку гамма-коррекции.
Приложения, работающие через удаленный рабочий стол, не могут управлять гамма-коррекцией вообще.
Курсор мыши, если он реализован в оборудовании (как и большинство из них), обычно не реагирует на гамма-параметр.
Связанные разделы
-
Руководство по программированию DXGI