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


Гамма (Direct3D 9)

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

Гамма-коррекция

Direct3D 9 может:

  • Укажите, является ли текстура гамма-2 исправленной или нет (sRGB или нет). Драйвер будет преобразовывать линейную гамму для операций смешивания во время SetTexture, или образец преобразует его в линейные данные во время поиска.
  • Укажите, должен ли конвейер пикселей гаммакорректно вернуться в пространство sRGB при записи в целевой объект отрисовки.

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

Не все форматы поверхностей могут быть линейизированы. Только форматы, которые передают CheckDeviceFormat с D3DUSAGE_QUERY_SRGBREAD, могут быть линейизированы. Состояние примера D3DSAMP_SRGBTEXTURE игнорируется для остальных. Ожидается, что для этого преобразования поддерживаются только неподписанные форматы текстур. Форматы текстур без знака включают только компоненты R, G, B и L. Если альфа-канал присутствует, он игнорируется. Если смешанные форматы поддерживают линейность SRGB, затрагиваются только неподписанные каналы. В идеале оборудование должно выполнять линейизацию перед фильтрацией, но в Direct3D 9 оборудование может выполнять линейнициализацию после фильтрации.

Не все форматы поверхности могут быть записаны в пространстве SRGB. Только форматы, которые передают CheckDeviceFormat с флагом использования, D3DUSAGE_QUERY_SRGBWRITE можно лилинезовать. Состояние отрисовки D3DRS_SRGBWRITEENABLE игнорируется для остальных. Ожидается, что восемь битов на канал RGB без знака форматы предоставляют эту возможность.

В идеале оборудование должно выполнять операции смешения буфера кадров в линейном пространстве, но оборудование может выполнять его после шейдера пикселей, но до смешивания буфера кадра. Это означает, что операции смешения буфера кадров, выполняемые в пространстве SRGB, будут выдавать неправильные результаты. D3DRS_SRGBWRITEENABLE учитывается при выполнении очистки целевого объекта отрисовки. Для оборудования, поддерживающего несколько целевых объектов отрисовки (Direct3D 9) или Текстуры нескольких элементов (Direct3D 9), записывается только первый целевой объект отрисовки или элемент.

Изменения API

// New sampler state (DWORD)
// If this is nonzero, the texture is linearized on lookup.
D3DSAMP_SRGBTEXTURE       // Default FALSE

// New render state (DWORD)
D3DRS_SRGBWRITEENABLE     // Default FALSE

// New usage flags
D3DUSAGE_QUERY_SRGBWRITE
D3DUSAGE_QUERY_SRGBREAD

Цепочки буферов с окнами

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

В Direct3D 9 новый флаг, D3DPRESENT_LINEAR_CONTENT, доступен для Present , который позволяет презентации неявно преобразовывать из линейного пространства в SRGB/гамма-гамма 2.2. Приложения должны указать этот флаг, если формат backbuffer имеет 16-разрядную плавающую точку, чтобы соответствовать окну режиму, представляющегося полноэкранным гамма-поведением, при условии, что D3DCAPS3_LINEAR_TO_SRGB_PRESENTATION возвращается для возможностей устройств, полученных с помощью GetDeviceCaps.

Буфер кадра