Выборка текстуры BC5_SNORM дает неверный диапазон значений - PullRequest
2 голосов
/ 17 марта 2012

Я работаю с Direct3d 11, и я столкнулся с чем-то странным.Я взял карту нормалей и закодировал ее в файл DDS дважды.Один раз с кодировкой R8G8B8A8_SNORM и один раз с BC5_SNORM .

Далее я загружаю каждую текстуру, используя D3DX11CreateShaderResourceViewFromFile в сочетании с FileInfo * 1010FF*.Когда я пробую эти текстуры в своем пиксельном шейдере, я обнаруживаю, что текстура R8G8B8A8_SNORM возвращает значения в диапазоне [-1,1], что я и ожидал бы для текстуры SNORM.Однако текстура BC5_SNORM возвращает значения в диапазоне [0,1], что не имеет для меня никакого смысла.

Я удваиваю тройку, проверенную моим отладчиком и PIX.Формат текстуры правильный ( BC5_ * S * NORM ), поэтому я не понимаю, почему он не возвращает подписанные значения.

1 Ответ

1 голос
/ 22 июля 2014

Мне удалось воспроизвести ту же проблему, что и вы, и я также получил то же поведение, когда выполнял преобразование из текстуры R8G8B8A8_SNORM (со значениями от -1 до +1) в BC5_SNORM (производя только значения от 0 до 1) при выполнении преобразования до D3Dx11LoadTextureFromTexture . Кажется, что в D3DX11 есть ошибка, по крайней мере, в отношении BC5_SNORM, в том, что независимо от всех видов форматов ввода, выход (BC5) SNORM всегда находится в диапазоне от 0 до 1.

В соответствии с предложением @chuckwalbourn я могу подтвердить, что утилиты DirectXTex , которые заменяют устаревший D3DX11, уважают и правильно обрабатывают подписанные значения для выходов BC5_SNORM.

Вы можете либо заставить вашу программу записать временные .dds (используя D3DX11SaveTextureToFile с текстурой R8G8B8A8_SNORM), а затем вызвать автономную утилиту DirectXTex 'texconv.exe' для преобразования в BC5_SNORM, либо вызвать DirectXTex в свою программу и используйте функцию 'Convert (...)' соответствующим образом.

...