在Photoshop / Gimp图像中编辑Alpha通道的非破坏性方式


9

想要为Unity3d制作纹理,我被困在一个似乎很简单的阶段。我的目标是创建一个RGBA图像,每个像素的颜色信息,以及一个单独的alpha通道。这两个成分分别作为基本色和反射强度输入到Unity中。(使用“反射/凸出的漫反射”材料。)

如果在Photoshop中使用遮罩工具,则可以擦除部分输出图像(透明度)。但是,我想在输出时保留原始的RBG颜色信息,而不仅仅是保留“空白”区域。另外,如果我可以无损地做到这一点,那就太好了。最终的Alpha通道取决于标准层,或由路径对象等构建。

我对Gimp也有同样的问题。

任何帮助,将不胜感激。

(如果不是Photoshop / Gimp的工具,有人可以推荐一个更好的工具吗?)

Answers:


4

Photoshop解决方案

删除图像的一部分只会影响该层。您要做的是创建一个单独的渠道来存储您的Alpha信息。

  1. 在带有“层/通道/路径”的工具面板中,选择“通道”选项卡。在这里,您将看到RGB,红色,绿色和蓝色。
  2. 使用面板底部的按钮创建一个新通道,这是您的Alpha通道。这是一个8位灰度通道,为您提供256级透明度。
  3. 您可以使用小的“眼睛”图标来打开/关闭此频道。
  4. 将您的信息绘制或复制/粘贴到频道中。

注意:保存时,请注意文件格式。.Tiff和.TGA之类的内容保存完整的alpha通道,而与颜色信息无关。但是,Photoshop不允许使用PNG,这使许多开发人员感到烦恼。它将无法正确保存Alpha通道图像,并且倾向于去除颜色信息以实现完全透明的区域以压缩文件大小。


这正是我的问题所在。我正在输出到PNG,但没有看到任何“ alpha”通道的优点。谢谢,这太完美了。是否有人有类似用法的说明?
eli

1
令人沮丧的是,回到5.0或5.5版Photoshop实际上会保存PNG上的完整频道。Adobe更改了其后续版本软件的处理方式。感叹...
wkerslake

4

我在GIMP中找到了执行此操作的最佳方法是使用图层蒙版(右键单击图层并创建蒙版)。

然后,该图层将具有与其关联的两个“图像”-RGBA图像和用作额外(乘法)alpha通道的灰度图层蒙版。您可以单击任一图像选择要编辑的图像。

如果按住CTRL键并单击图层蒙版,您将仅看到RGBA图像(这将禁用蒙版)。如果按住ALT键并单击图层蒙版,则只会看到图层蒙版。

导出带有活动图层蒙版的图像时,即使蒙版完全透明的区域,导出的图像也将保留颜色信息。

出于您的目的,您可能会发现在单独的(RGBA)图层上合成Alpha通道非常有效-然后,您可以将其复制到原始图层的图层蒙版中。


这更接近我的需求。但这只会影响顶层!我的图像中有多个图层,我希望能够做到这一点而不会使其变平。谢谢回答。
eli

将遮罩层添加到图像的每一层。
deft_code 2010年

2

在GIMP中,一种方法是将图像分成每个通道的图层。选择“颜色”->“组件”->“分解”,然后选择RGBA或您想要分成图层的任何通道。然后根据需要编辑单独的Alpha和颜色通道(它们应为灰度),然后转到“颜色->组件->合成”选择所需的通道布局,并选择要用于每个通道的图层。

另外,您可以使用“通道”对话框。它应该是默认工具箱中的一部分,但如果没有,则可以选择“ Windows-> Dockable Dialogues-> Channels”。您可以切换每个颜色通道的可见性,并且通过单击并突出显示通道名称,可以选择要单独编辑的通道名称(看起来它保留了alpha的颜色,尽管我看不到有什么方法可以“隐藏” alpha。编辑而不隐藏整个图像...)。


看来我必须先弄平图像,然后分解,然后编辑,然后重新构图。谢谢你的提示!但我正在寻找一种非破坏性的方法。
eli

嗯,我以为您正在处理单层图像,因此不需要进行展平,但是没关系。祝好运!
莱利·亚当斯

2

要编写特定于Unity3D的自己的内容处理器(如@Andrew Russell所建议),请将此脚本放在您的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

一种替代方法是编写您自己的内容处理器以执行所需的操作。这样,您可以简单地给“反射率”层(甚至多个反射率层)起一个特殊的名称,然后让内容处理器为您将数据放在alpha通道中。(或者实际上实现您喜欢的任何类型的过程。)

如果您使用的是XNA和GIMP(这是我使用并熟悉的),那么将XCF导入器添加到内容管道中并进行必要的修改以处理特殊命名的图层将非常容易。

当您使用Unity而不是XNA时,我不熟悉可用的内容管道选项。但是也许您可以调整链接的代码,使其在您的内容过程中起作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.