2016-09-22 8 views
1

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

Возможно, есть способ конвертировать уже загруженную текстуру от 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} is 1)

  • Метаданные WIC для TIFF indi Кейтс SRGB (/ifd/exif/{ushort=40961} является 1)

  • Если вы передаете «истина», как параметра forceSRGB к версии Ex функции

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

гамма-коррекции рендеринга достигается путем использования DXGI_FORMAT_*_SRGB или HDR (10: 10: 10: 2, 16: 16: 16: 16) формат BackBuffer. Вам также необходимо использовать линейные цвета для Clear. См. DeviceResources, Gamma-correct rendering, The Importance of Being Linear и Linear-Space Lighting (i.e. Gamma) для получения более подробной информации.

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

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

+0

В настоящий момент я немного поражен, так как я просто читал ваши образцы dx11! Спасибо, что нашли время ответить! Я переношу dx9 рендерера в dx11, и я столкнулся с проблемами sRGB. Мой backbuffer и текстуры - sRGB. Все нормально, пока я не начну умножать текстуру с цветом вершин.Я не могу найти информацию - драйвер преобразует вершинные цвета в sRGB? Возникает ли альфа-канал? Я получаю результаты, которые выглядят корректно, только если я преобразовываю цвет вершин (вместе с альфа-каналом) в sRGB в шейдере, затем умножаюсь на выбранный цвет и возвращаю результат. Это не кажется правильным ... – Konstanty

+0

Я думаю, мой вопрос должен читать: «Если моя текстура sRGB и backbuffer - это sRGB, как мне умножить цвет, выбранный из текстуры, с цветом, переданным в вершине, чтобы получить правильное альфа-смешение «так как это был корень исходной проблемы. Я пытался переместить весь рендеринг в линейное пространство, о котором я знаком. – Konstanty

+0

Когда вы производите выборку из текстуры с форматом sRGB, сэмплер должен делиться так, чтобы ваш шейдер работал со всем линейным цветовым пространством. Затем вы записываете свои линейные значения цвета, а в представлении целевой рендеринга sRGB применяется гамма, чтобы вернуть его в цветовое пространство sRGB для рендеринга. Вершинные (и четкие) цвета затем будут указаны в линейном цветовом пространстве. –