Поделиться через


Гамма-элементы управления (Direct3D 9)

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

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

Для каждого устройства всегда существует по крайней мере одна цепочка буферов (неявная цепочка буферов), так как Direct3D 9 имеет одну цепочку буферов в качестве свойства устройства. Поскольку гамма-пандус является свойством цепочки буферов, гамма-пандус можно применить при окне цепочки буферов. Гамма-пандус немедленно вступает в силу. Нет ожидания вертикальной операции синхронизации.

Методы SetGammaRamp и GetGammaRamp позволяют управлять уровнями рампы, влияющими на красные, зеленые и синие цветовые компоненты пикселей с поверхности, прежде чем они отправляются в цифровой аналоговый преобразователь (DAC) для отображения.

Уровни гамма-пандуса

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

Вот как это работает: Direct3D принимает пиксель из буфера кадра и оценивает отдельные красные, зеленые и синие цвета компоненты. Каждый компонент представлен значением от 0 до 65535. Direct3D принимает исходное значение и использует его для индексирования массива 256 элементов (пандус), где каждый элемент содержит значение, заменяющее исходное. Direct3D выполняет этот процесс поиска и замены для каждого компонента цвета каждого пикселя в буфере кадра, тем самым изменяя окончательные цвета для всех пикселей на экране.

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

графы значений гамма-рампы

Элементы массива для графа слева содержат значения, идентичные индексу— 0 в элементе по индексу 0 и 65535 по индексу 255. Этот тип пандуса используется по умолчанию, так как он не изменяет входные значения перед отображением. Правый граф предоставляет больше вариантов; его пандус содержит значения, которые варьируются от 0 в первом элементе до 32768 в последнем элементе, с значениями, которые отличаются равномерно между ними. Эффект заключается в том, что цветной компонент, использующий этот пандус, отображается отключенным на дисплее. Вы не ограничиваетесь использованием линейных графов; Если приложение может при необходимости назначить произвольное сопоставление. Вы даже можете задать записи на все нули, чтобы полностью удалить цветной компонент из дисплея.

Настройка и получение уровней гамма-пандуса

Уровни гамма-пандуса — это эффективно отображаемые таблицы, которые Direct3D использует для сопоставления компонентов цвета буфера кадра с новыми уровнями, которые будут отображаться. Вы можете задать и получить уровни рампы для основной поверхности, вызвав методы SetGammaRamp и Методы GetGammaR amp. SetGammaRamp принимает два параметра и GetGammaRamp принимает один параметр. Для SetGammaRampпервый параметр — D3DSGR_CALIBRATE или D3DSGR_NO_CALIBRATION. Второй параметр, pRamp, является указателем на структуру D3DGAMMARAMP. Структура D3DGAMMARAMP содержит три массива 256 элементов WORD, один массив каждый из которых содержит красные, зеленые и синие гамма-пандусы. GetGammaRamp имеет один параметр, который принимает указатель на тип D3DGAMMARAMP, который будет заполнен текущим гамма-пандусом.

Вы можете включить значение D3DSGR_CALIBRATE для первого параметра SetGammaRamp для вызова калибратора при настройке новых гамма-уровней. Калибровка гамма-пандусов вызывает некоторые затраты на обработку и не следует часто использовать. Настройка калибровки гамма-пандуса обеспечивает согласованное и абсолютное гамма-значение для пользователя независимо от адаптера дисплея и монитора.

Не все системы поддерживают гамма-калибровку. Чтобы определить, поддерживается ли гамма-калибровка, вызовите GetDeviceCapsи проверьте член Caps2 связанной структуры D3DCAPS9 после возврата метода. Если флаг возможности D3DCAPS2_CANCALIBRATEGAMMA присутствует, то поддерживается гамма-калибровка.

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

Если устройство не поддерживает гамма-пандусы в текущем режиме презентации цепочки буферов (полноэкранный или оконный), значение ошибки не возвращается. Приложения могут проверять биты D3DCAPS2_FULLSCREENGAMMA и D3DCAPS2_CANCALIBRATEGAMMA в элементе Caps2 типа D3DCAPS9, чтобы определить возможности устройства и установить ли калибратор.

Surfaces Direct3D