Гамма-элементы управления (Direct3D 9)
Гамма-элементы управления позволяют изменять способ отображения в системе содержимого поверхности, не влияя на содержимое самой поверхности. Эти элементы управления можно рассматривать как очень простые фильтры, которые Direct3D применяет к данным по мере того, как они покидают поверхность и перед отображением на экране.
Гамма-элементы управления являются свойством цепочки буферов. Гамма-элементы управления позволяют динамически изменять способ сопоставления красного, зеленого и синего уровней поверхности с фактическими уровнями, отображаемыми в системе. Задавая гамма-уровни, вы можете заставить экран пользователя мигать цветами : красным при снимке символа пользователя, зеленым, когда он выбирает новый элемент, и т. д. — без копирования новых изображений в буфер кадров для достижения эффекта. Вы также можете настроить уровни цвета, чтобы применить цветовое смещение к изображениям в заднем буфере.
Для каждого устройства всегда существует по крайней мере одна цепочка буферов (неявная цепочка буферов), так как Direct3D 9 имеет одну цепочку буферов в качестве свойства устройства. Поскольку гамма-пандус является свойством цепочки буферов, гамма-пандус может применяться при окне цепочки буферов. Гамма-пандус вступает в силу немедленно. Операция вертикальной синхронизации не ожидается.
Методы SetGammaRamp и GetGammaRamp позволяют управлять уровнями рампы, которые влияют на компоненты красного, зеленого и синего цвета пикселей с поверхности перед их отправкой в цифровой аналоговый преобразователь (DAC) для отображения.
Уровни гамма-рампы
В Direct3D термин гамма-пандус описывает набор значений, которые сопоставляют уровень определенного компонента цвета (красный, зеленый, синий) для всех пикселей в буфере кадров с новыми уровнями, которые получаются приложением уровня данных для отображения. Переназначение выполняется с помощью трех таблиц поиска, по одной для каждого компонента цвета.
Вот как это работает: Direct3D принимает пиксель из буфера кадров и оценивает отдельные компоненты красного, зеленого и синего цветов. Каждый компонент представлен значением от 0 до 65535. Direct3D принимает исходное значение и использует его для индексирования массива из 256 элементов (рампы), где каждый элемент содержит значение, заменяющее исходное. Direct3D выполняет этот процесс поиска и замены для каждого компонента цвета каждого пикселя в буфере кадров, тем самым изменяя окончательные цвета для всех экранных пикселей.
Удобно визуализировать значения пандуса, набив их на график, как показано на следующих двух графиках. На левом графике показана рампа, которая вообще не изменяет цвета. На правом графике показан пандус, который накладывает отрицательное смещение к компоненту цвета, к которому он применяется.
Элементы массива для графа слева содержат значения, идентичные их индексу: 0 в элементе с индексом 0 и 65535 в индексе 255. Этот тип пандуса используется по умолчанию, так как он не изменяет входные значения перед их отображением. Правый граф предоставляет больше вариантов; Его пандус содержит значения, которые варьируются от 0 в первом элементе до 32768 в последнем элементе, при этом значения равномерно варьируются между ними. Эффект заключается в том, что компонент цвета, использующий этот пандус, отображается приглушенным на дисплее. Вы не ограничены использованием линейных графов; Значение , если приложение может назначать произвольное сопоставление при необходимости. Вы даже можете задать для записей все нули, чтобы полностью удалить компонент цвета с экрана.
Установка и получение уровней гамма-пандуса
Уровни гамма-пандуса — это фактические таблицы поиска, которые Direct3D использует для сопоставления компонентов цвета буфера кадров с новыми уровнями, которые будут отображаться. Вы можете задать и получить уровни рампы для основной поверхности, вызвав методы SetGammaRamp и GetGammaRamp . 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, чтобы определить возможности устройства и установить ли калибратор.
Связанные темы