Неразрушающий способ редактирования альфа-канала в Photoshop / Gimp image

9

Я хочу сделать текстуры для Unity3d, и я застрял на том, что кажется простым этапом. Моя цель - создать изображение RGBA с информацией о цвете для каждого пикселя и отдельным альфа-каналом. Эти два компонента вводятся в Unity в качестве базового цвета и силы отражения соответственно. (Использование материала «Отражающий / Удар диффузный».)

Если я использую маскирующие инструменты в Photoshop, я могу стереть части выходного изображения (прозрачность). Однако я хотел бы сохранить исходную информацию о цвете RBG при выводе, а не просто иметь «пустые» области. Кроме того, было бы хорошо, если бы я мог сделать это неразрушающим, т.е. конечный альфа-канал зависит от стандартного слоя или построен из объекта пути и т. д.

У меня та же проблема с Gimp.

Любая помощь по этому вопросу будет принята с благодарностью.

(Если Photoshop / Gimp не являются инструментами для работы, кто-то может порекомендовать лучший?)

Eli
источник

Ответы:

4

Решение Photoshop

Удаление части изображения влияет только на этот слой. Что вы хотите сделать, это создать отдельный канал, который хранит вашу альфа-информацию.

  1. На панели инструментов с Layers / Channels / Paths выберите вкладку Channels. Здесь вы увидите RGB, красный, зеленый и синий.
  2. Создайте новый канал, используя кнопку внизу панели, это ваш альфа-канал. Это 8-битный канал в оттенках серого, обеспечивающий 256 уровней прозрачности.
  3. Вы можете использовать маленькие значки «глаз», чтобы включить / выключить этот канал.
  4. Нарисуйте или скопируйте / вставьте вашу информацию в канал.

Примечание: при сохранении нужно быть осторожным с форматами файлов. Такие вещи, как .Tiff & .TGA сохраняют полный альфа-канал независимо от информации о цвете. Однако Photoshop не позволяет этого с PNG, что очень раздражает многих разработчиков. Он не будет правильно сохранять изображения альфа-канала и имеет тенденцию удалять информацию о цвете для полностью прозрачных областей для сжатия размера файла.

wkerslake
источник
Это было именно то, что было моей проблемой. Я выводил в PNG и не видел ничего хорошего в "альфа-канале". Спасибо, это прекрасно. У кого-нибудь есть инструкции по использованию Gimp аналогичным образом?
Или
1
Это разочаровывает, потому что в версии 5.0 или 5.5 Photoshop фактически сохранил полный канал на PNG. Adobe изменила способ их обработки для последующих версий программного обеспечения. Вздох ...
wkerslake
4

Я считаю, что лучший способ сделать это в GIMP - использовать маску слоя (щелкните правой кнопкой мыши на слое и создайте маску).

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

Если вы удерживаете клавишу CTRL и щелкаете маску слоя, вы увидите только изображение RGBA (это отключит маску). Если вы удерживаете нажатой клавишу ALT и щелкаете маску слоя, вы увидите только маску слоя.

При экспорте изображения с активной маской слоя экспортированное изображение сохранит информацию о цвете даже из областей, которые маска делает полностью прозрачными.

Для ваших целей может оказаться полезным скомпоновать ваш альфа-канал на отдельном (RGBA) слое - тогда, когда вы закончите, вы можете просто скопировать этот слой в маску слоя исходного слоя.

Эндрю Рассел
источник
Это ближе к тому, что мне нужно. Но это влияет только на верхний слой! У меня есть несколько слоев в моем изображении, и я хотел бы сделать это без выравнивания. Спасибо за ответы.
Или
Добавьте слой маски к каждому слою вашего изображения.
deft_code
2

В GIMP одним из способов было бы разделить изображение на слои для каждого канала. Выберите «Colors-> Components-> Decompose» и выберите RGBA или любые другие каналы, которые вы хотите разбить на слои. Затем отредактируйте ваши индивидуальные альфа-каналы и цветовые каналы по своему усмотрению (они должны быть в оттенках серого), затем перейдите в «Цвета-> Компоненты-> Компоновка», выберите желаемую компоновку канала и выберите слои для каждого канала.

Также вы можете использовать диалог «Каналы». Это должно быть частью набора инструментов по умолчанию, но если нет, вы можете выбрать «Windows-> Dockable Dialogues-> Channels». Вы можете переключать видимость каждого цветового канала, и, нажимая и выделяя названия каналов, вы можете выбрать, какие из них редактировать по отдельности (похоже, он сохраняет цвет с альфа-каналом, хотя я не вижу способа «скрыть» альфа-канал, пока редактирование без скрытия всего изображения ...).

Райли Адамс
источник
Похоже, я должен сначала сплющить изображение, затем разложить, затем отредактировать, а затем заново составить. Спасибо за совет! Но я ищу неразрушающий путь.
Или
Аааа, я предположил, что вы работаете с однослойным изображением, поэтому выравнивание не понадобится, но не обращайте на это внимания. Удачи!
Райли Адамс
2

Чтобы написать свой собственный контент-процессор (как предложено @Andrew Russell), специфичный для Unity3D, поместите этот скрипт в вашу Assets/Editorпапку, объедините любое изображение *-Base.*с *-Alpha.*файлом с аналогичным именем и измените исходную текстуру:

class AlphaCombinerPostprocessor extends AssetPostprocessor {
    function OnPostprocessTexture(texture : Texture2D)
    {
        if (assetPath.Contains("-Base.")) {
            var fn = assetPath.Replace("-Base.","-Alpha.");
            var alpha = AssetDatabase.LoadAssetAtPath(fn,Texture2D);
            if (alpha) {
                Debug.Log("Adding alpha from "+fn);
                var c : Color[] = texture.GetPixels();
                var a : Color[] = alpha.GetPixels();
                if (c.Length != a.Length) {
                    Debug.LogError(fn+" is different size to "+assetPath);
                    return;
                }
                for (var i=0; i<c.Length; i++)
                    c[i].a = a[i].a;
                texture.SetPixels(c);
                texture.Apply(true);
            }
        }
    }
}

Приспособьтесь к своим собственным соглашениям об именах файлов активов.

Уорик Эллисон
источник
0

Один из вариантов - написать собственный процессор контента для выполнения нужной вам операции. Таким образом, вы можете просто дать своему слою «отражающей способности» (или даже нескольким слоям отражательной способности) специальное имя, и процессор содержимого поместит эти данные в альфа-канал для вас. (Или действительно реализуйте любой процесс, который вам нравится.)

Если вы использовали XNA и GIMP (это то, что я использую и знакомы с ним), вам будет очень легко добавить этот импортер XCF в ваш конвейер контента и внести необходимые изменения для обработки специально названных слоев.

Поскольку вы используете Unity, а не XNA, я не знаю, какие опции конвейера контента у вас есть. Но, возможно, вы можете адаптировать связанный код так, чтобы он работал в рамках вашего контента.

Эндрю Рассел
источник