306. Как работать с альфой в текстурах?

Сразу оговорюсь,что для текстур я всегда использую формат PNG. Как по мне, он даёт хорошее соотношение между качеством и размером файла, поддерживает 8 и 16 бит на канал, легко редактировать и его поддерживают все. Можете со мной не соглашаться, но бОльшая часть поста завязана именно на PNG и тонкости работы с ним.

Как извлечь альфа-канал из PNG?

Часто бывает такое, что нужно разделить альфа-канал (прозрачность) и RGB-каналы. Например, извлечь Smoothness из карты Metallic/Smoothness или  извлечь прозрачность из декали, для более точного редактирования.

Эту задачу можно легко решить с помощью Adobe Photoshop.

1. Открываем PNG в Photoshop и выбираем наш слой.

 2. Нажимаем на пункт меню Layer -> Layer Mask -> From Transparency. Это команда конвертирует альфа канал в маску слоя, с которой удобно работать.

3. Альфа-канал (прозрачность) будет конвертирован в альфа-маску слоя.

Артефакты на границе прозрачности

Почти все сталкивались с проблемой, когда вокруг текстуры с прозрачностью возникает белый (иногда другого цвета) контур.

Белый контур вокруг листьев

Этот контур возникает из-за того, что альфа не может идеально совпадать с изображением в RGB канале. По мере уменьшения MipMap уровней, контур будет только увеличиваться. Схожая ситуация случается, когда острова развёртки на текстуре не имеют запаса по отношению к островам на модели и появляются швы в движке.
 В обоих случаях проблема решается одинаково – с помощью Dilation’а текстуры.

Что такое Dilation можно прочитать в статье “Substance Painter. Параметры запекания. Полный разбор”

В случае текстур с прозрачностью Dilation применяется к RGB составляющей текстуры, а альфа остаётся в исходном виде.

Теперь рассмотрим как это сделать в Adobe Photoshop.

1. Скачиваем и устанавливаем Action тут или тут.

2. Открываем изображение и дублируем слой.

3. Выбираем нижний слой и выбираем функцию Layer->Matting->Defringe со значением по умолчанию (1 пиксель). Это позволит нам избавится от мусора на Diation. 

4. Выбираем нижний слой и запускаем Action “Dilate many times“.

5. Будет создано несколько слоёв. Выделяем все слои, кроме верхнего (исходного) слоя и сливаем в один (Ctrl+E).

6. Повторяем нужное количество раз шаги 4 и 5. Пока размер Dilation’a не будет достаточно большим. Чем выше разрешение текстуры, тем бОльшее количество раз придётся повторить эти шаги.

7. Теперь необходимо перенести альфу с исходного слоя на слой с Dilation. Для этого выбираем верхний слой и извлекаем прозрачность в маску слоя (Layer -> Layer Mask -> From Transparency).

8. Копируем маску слоя из верхнего в нижний.

9. Скрываем верхний слой и сохраняем в PNG.

Проблема с сохранением чёрного в альфе из Photoshop

Ещё один очень важный момент. Photophop при сохранении PNG любит думать, что в местах изображения, где прозрачность равна 100% (альфа абсолютно чёрная), информация о цвете не нужна и он делает эти пиксели белыми (или чёрными).

Исходное изображение. Градиент в RGB и чёрно-белая маска
Это же изображение, сохранённое в PNG и открытое заново. Информация под прозрачностью потеряна.

Как же решить эту проблему?

1. Нажимаем с зажатым Alt по маске слоя, чтобы перейти в редактирование маски.

2. Нажимаем Ctrl+L для редактирования уровней. Устанавливаем в Outputl Levels значение 2 вместо 0.

3. Сохраняем в PNG.

Смысл в том, что мы незначительно высветляем чёрный (с #000000 до #020202). Визуально это совершенно не заметно, а для Photoshop это является знаком, что пиксели под прозрачностью удалять не стоит.

После сохранения в PNG и повторного открытия

Вернуться к энциклопедии