(DirectX9) Гамма-коррекция применяется имплицитно - PullRequest
2 голосов
/ 28 июня 2011

ОБНОВЛЕНИЕ:

Большое спасибо всем за ваши ответы.Как предположил Джесси Холл, похоже, это проблема с драйверами (или оборудованием).Я попробовал то же самое приложение в других конфигурациях, и оно работало, как и ожидалось.

Я протестировал приложение на других компьютерах, которые используют один и тот же графический процессор (ATI 4800 HD), но разные версии драйвера, и все они показали одинаковую ошибкуповедение (что похоже на двойную гамма-коррекцию при записи).На этих компьютерах, если необходимо установить D3DRS_SRGBWRITEENABLE в false, чтобы исправить отображение.Кто-нибудь знает, является ли это известной ошибкой на этом оборудовании?

Еще более странным является то, что я получаю одинаковые конечные результаты с этими двумя конфигурациями:

  • D3DRS_SRGBWRITEENABLE = FALSE и D3DSAMP_SRGBTEXTURE to TRUE
  • D3DRS_SRGBWRITEENABLE = FALSE и D3DSAMP_SRGBTEXTURE to FALSE

В пиксельном отладчике я вижу, что линеаризация применяется правильно в случае 1, но (автоматическая) коррекция при записи дает тот же результат, что и в случае2 (который вообще не выполняет преобразование) ...

// - КОНЕЦ ОБНОВЛЕНИЯ

У меня возникли проблемы с исправлением гамма-коррекции в приложении DirectX9.

Когда я включаю линеаризацию текстуры в сэмплерах (D3DSAMP_SRGBTEXTURE) и запись sRGB для вывода (D3DRS_SRGBWRITEENABLE), похоже, что гамма-коррекция применяется дважды.

Вот мои настройки.Я использовал следующую текстуру (от здесь ), чтобы нарисовать полноэкранный квад: enter image description here

Результаты были визуально слишком яркими в правой части изображения.Я использовал PIX для отладки одного из этих серых пикселей и, если бы все было настроено правильно, я ожидал бы выходное значение 0,73 (= 0,5 ^ (1,0 / 2,2)).К сожалению, выход пиксельного шейдера составил 0,871 (похоже, что это может быть гамма-коррекция, примененная дважды?).Я вошел в пиксельный шейдер с помощью отладчика, и выборка текстуры вернула значение (0,491, 0,491, 0,491), что должно означать, что линеаризация при чтении работала правильно.

enter image description here

КогдаЯ отключаю D3DRS_SRGBWRITEENABLE, вывод пиксельного шейдера составляет 0,729, что выглядит для меня гораздо более правильным.

enter image description here enter image description here

Любая идея, откуда происходит это преобразование (в отладчикевыход пиксельного шейдера был 0,491)?Какие другие флаги / состояния рендеринга я должен проверить?

Большое спасибо за вашу помощь!

Ответы [ 2 ]

3 голосов
/ 01 июля 2011

Одна возможность состоит в том, что вы применяете линейное к гамма-преобразованию дважды. Один раз при записи в цель рендеринга с помощью D3DRS_SRGBWRITEENABLE. Затем в другой раз при представлении буфера кадра с помощью D3DPRESENT_LINEAR_CONTENT (если вы указали этот флаг). Вам не нужен D3DPRESENT_LINEAR_CONTENT, поскольку вы уже преобразовали обратно в пространство rgb с помощью D3DRS_SRGBWRITEENABLE.

Другая возможность состоит в том, что ваше графическое оборудование фильтрует текстуру перед преобразованием в линейное пространство для вашего пиксельного шейдера. Вы можете проверить это, отключив D3DSAMP_SRGBTEXTURE и применив фильтрацию, а затем выполнив преобразование в линейное пространство и фильтрацию в пиксельном шейдере. Или просто нарисовать текстуру достаточно большую, чтобы фильтрация не была проблемой. Хорошую статью о гамма-коррекции, в которой также упоминается, что карты GeForce 8 и новее правильно преобразовывают в линейное пространство перед фильтрацией, можно найти здесь:

http://http.developer.nvidia.com/GPUGems3/gpugems3_ch24.html

Если вы не используете D3DPRESENT_LINEAR_CONTENT, то мое следующее предположение состоит в том, что ваша видеокарта не поддерживает выполняемые вами гамма-преобразования. Проверьте возможности устройства программно или с помощью такого инструмента, как DirectX Caps Viewer Tool:

http://msdn.microsoft.com/en-us/library/ee417852%28v=vs.85%29.aspx

2 голосов
/ 06 июля 2011

Это связано с вопросом, но не совсем, но стоит знать!

Я столкнулся с ошибкой во время выполнения D3D9 в Vista / Win7. Эта среда выполнения является своего рода эмуляционным слоем, написанным поверх D3D10. В D3D10 состояние SRGB является свойством формата текстуры, в D3D9 это состояние рендеринга на основе сэмплера. При настройке текстуры D3D9 состояние SRGB всегда устанавливается на «выкл», потерянное, поскольку формат текстуры, вероятно, используется, а D3D9 не имеет формата текстуры SRGB. Это означает, что состояние D3DSAMP_SRGBTEXTURE должно быть установлено после привязки текстуры для правильного отображения.

...