Мне удалось воспроизвести ту же проблему, что и вы, и я также получил то же поведение, когда выполнял преобразование из текстуры 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 (...)' соответствующим образом.