Я использовал DirectXTex
библиотека для захвата скриншота игры DX11 и сохранения его в файл. Проблема в том, что он прекрасно работает, когда я сохраняю его в формате JPEG, но если я сохраню его в формате PNG, изображение станет очень ярким и размытым. Я проверил изображение с помощью TweakPNG
и обнаружил, что гамма была установлена на 1,0, и это то, что вызывает проблему.
Я проверил изображения, снятые некоторыми другими программами, в том числе инструментом для разрезания, и они, кажется, используют 0,45455 как гамму, или они вообще не учитывают значение гаммы.
Я не знаю, если DirectXTex
позвольте мне указать значение гаммы или нет. Я даже не уверен, если WIC
имеет эту функцию, так как я не могу найти полезную информацию ни на MSDN, ни на других сайтах.
По умолчанию DirectXTex добавит sRGB
кусок к PNG
файл, который он пишет, если формат DXGI_FORMAT_*_SRGB
, Кроме того, если формат не DXGI_FORMAT_*_SRGB
Я явно удаляю sRGB
кусок и установить gAMA
кусок до 1,0, потому что в противном случае WIC всегда добавляет sRGB
Кусок.
Вы можете увидеть это поведение в коде в обоих DirectXTexWIC.cpp и в Набор инструментов DirectX«s ScreenGrab.cpp модуль.
Если вы не выполняете «гамма-правильный» рендеринг, где ваша цель рендеринга DXGI_FORMAT_*_SRGB
форматировать, но иметь содержание sRGB в DXGI_FORMAT_*
формат, то я рекомендую передать функции формат sRGB.
В DirectXTex это легко сделать с помощью MakeSRGB
функция.
Гамма-коррекция в формате PNG немного беспорядочная. Увидеть этот блог
Других решений пока нет …