Загрузка текстуры как RGB, а не s RGB в DirectX11 с использованием WIC

Я загружаю текстуры с помощью CreateWICTextureFromMemoryEx от DirectXTK. Все, что я загружаю, преобразуется в sRGB, Есть ли способ заставить WIC создать RGB поверхность вместо?

Или, может быть, есть способ конвертировать уже загруженную текстуру из sRGB в RGB? Назад в D3DX раньше было D3DX11_FILTER_SRGB флаг для этого (из того, что я понимаю), но это не устарело.

Любая помощь будет очень ценится, спасибо!

1 ответ

Решение

Загрузчик DirectX Tool Kit использует DXGI_FORMAT_*_SRGB при загрузке изображений WIC по нескольким причинам:

  • Метаданные WIC для файла PNG содержат блок sRGB (/sRGB/RenderingIntent правда)

  • Метаданные WIC для JPG указывают на sRGB (/app1/ifd/exif/{ushort=40961} это 1)

  • Метаданные WIC для TIFF указывают sRGB (/ifd/exif/{ushort=40961} это 1)

  • Если вы передадите 'true' в качестве параметра forceSRGB в Ex-версию функции

Таким образом, изображение, скорее всего, находится в цветовом пространстве sRGB. Следовательно DXGI_FORMAT_*_SRGB указывает на то, что показания из этой текстуры должны подвергаться де-гамме, чтобы получить их в линейном цветовом пространстве. Я предполагаю, что вы не используете гамма-корректный рендеринг здесь?

Гамма-корректный рендеринг достигается с помощью DXGI_FORMAT_*_SRGB или формат обратного буфера HDR (10:10:10:2, 16:16:16:16). Вам также нужно использовать линейные цвета для Clear, См. DeviceResources, Гамма-корректный рендеринг, Важность линейности и Освещение в линейном пространстве (т. Е. Гамма) для получения подробной информации.

Быстрое и простое решение, если вы управляете файлом текстуры, заключается в использовании texconv в библиотеке DirectXTex для преобразования исходного изображения в DDS, Вы можете использовать различные переключатели, такие как -srgbi или же -srgbo чтобы заставить поведение SRGB вы после.

Обратите внимание, что я также добавляю опцию, позволяющую игнорировать метаданные sRGB при использовании WICTextureLoader для будущего выпуска DirectX Tool Kit. Лучше всего использовать линейный рендеринг, но иногда приятно иметь возможность избежать DXGI_FORMAT_*_SRGB Формат используется.

Другие вопросы по тегам