MTKTextureLoader вызывает полосы в изображении в градациях серого - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь реализовать простую цветовую оценку LUT в металлическом шейдере.Он работает с цветным LUT, но когда LUT имеет оттенки серого, возникают проблемы.Во-первых, загрузка изображения в градациях серого вызывает ошибку «Ошибка декодирования изображения», которая исправляется с помощью этого обходного пути ошибки .

Повторно характеризуя изображение как текстуру в комплекте ресурсов, оно успешно загружается, но на выходном изображении появляются полосы.Конечно же, захват кадра GPU показывает, что в текстуру введены полосы:

banding in LUT texture

Эта полоса не появляется при выполнении быстрого просмотра впакет активов или исходный PNG.Проверка пиксельного формата текстуры показывает, что он был закодирован как ASTC_4x4_sRGB, который в документации Apple указывает на сжатый формат для контента с низким динамическим диапазоном.Кажется, что это сжатие может быть причиной ухудшения текстуры LUT.Обычно при работе с LUT я стараюсь избегать сжатия, но не могу найти способ отключить сжатие или принудительно использовать формат пикселей в MTKTextureLoader.

Я также пробовал различные параметры MTKTextureLoader, включая включение/ отключение sRGB, mipmaps и т. д.

Есть идеи, как исправить полосу?

1 Ответ

0 голосов
/ 19 января 2019

Важно понимать, что при использовании MTKTextureLoader с активами текстур в каталоге ресурсов большинство параметров загрузчика текстур во время выполнения игнорируются. Возможно, это не задокументировано, но в настоящее время это так.

Вы можете избежать этого автоматического сжатия (которое является благонамеренным, но одновременно неуклюжим и слишком агрессивным), выбрав свой ресурс в редакторе каталога ресурсов XCode и явно указав для его формата пикселей значение «8-битная нормализация - RGBA». ", который отображается на .rgba8Unorm во время выполнения.

Xcode texture asset settings

...