ОБНОВИТЬ:
Всем большое спасибо за ваши ответы. Как предположил Джесси Холл, похоже, что это проблема с драйвером (или аппаратным обеспечением). Я пробовал это же приложение на других конфигурациях, и оно работало, как и ожидалось.
Я тестировал приложение на других компьютерах с тем же графическим процессором (ATI 4800 HD), но с разными версиями драйвера, и все они показали одно и то же ошибочное поведение (похоже, это двойная гамма-коррекция при записи). На этих компьютерах необходимо установить для параметра D3DRS_SRGBWRITEENABLE значение false, чтобы исправить отображение. Кто-нибудь знает, является ли это известной ошибкой на этом оборудовании?
Еще более странно то, что я получаю одинаковые конечные результаты с этими двумя конфигурациями:
- D3DRS_SRGBWRITEENABLE = FALSE и D3DSAMP_SRGBTEXTURE в TRUE
- D3DRS_SRGBWRITEENABLE = FALSE и D3DSAMP_SRGBTEXTURE в FALSE
В отладчике пикселей я вижу, что линеаризация применяется правильно в случае 1, но (автоматическая) коррекция при записи дает тот же результат, что и в случае 2 (который вообще не выполняет преобразование)...
// -- КОНЕЦ ОБНОВЛЕНИЯ
У меня возникли проблемы с исправлением гамма-коррекции приложения DirectX9.
Когда я включаю линеаризацию текстур в сэмплерах (D3DSAMP_SRGBTEXTURE) и запись sRGB для вывода (D3DRS_SRGBWRITEENABLE), похоже, что гамма-коррекция применяется дважды.
Вот моя установка. Я использовал следующую текстуру (из здесь), чтобы нарисовать полноэкранный четырехугольник:
Результаты были визуально слишком яркими в правой части изображения. Я использовал PIX для отладки одного из этих серых пикселей, и, если бы все было настроено правильно, я бы ожидал выходного значения 0,73 (= 0,5 ^ (1,0/2,2)). К сожалению, результат пиксельного шейдера был равен 0,871 (похоже, это может быть гамма-коррекция, примененная дважды?). Я вошел в пиксельный шейдер с помощью отладчика, и выборка текстуры вернула значение (0,491, 0,491, 0,491), что должно означать, что линеаризация при чтении работает правильно.
Когда я отключаю D3DRS_SRGBWRITEENABLE, результат пиксельного шейдера равен 0,729, что мне кажется более правильным.
Есть идеи, откуда взялось это преобразование (в отладчике вывод пиксельного шейдера был 0,491)? Какие еще флаги/состояния рендеринга я должен проверить?
Большое спасибо за Вашу помощь!