Manière non destructive de modifier le canal alpha dans l'image Photoshop / Gimp

9

Vous cherchez à créer des textures pour Unity3d, et je suis bloqué sur ce qui semble être une étape simple. Mon objectif est de créer une image RGBA, avec des informations de couleur pour chaque pixel, et un canal alpha séparé. Ces deux composants sont introduits dans Unity en tant que couleur de base et force de réflexion, respectivement. (Utilisation d'un matériau "réfléchissant / diffusé".)

Si j'utilise des outils de masquage dans Photoshop, je peux effacer des parties de l'image de sortie (transparence). Cependant, je voudrais conserver les informations de couleur RBG d'origine lors de la sortie, et pas seulement avoir des zones "vides". De plus, ce serait bien si je pouvais le faire de manière non destructive, c'est-à-dire. le canal alpha final dépend d'un calque standard, ou construit à partir d'un objet chemin, etc.

J'ai le même problème avec The Gimp.

Toute aide à ce sujet serait grandement appréciée.

(Si Photoshop / Gimp ne sont pas les outils pour le travail, quelqu'un peut-il en recommander un meilleur?)

eli
la source

Réponses:

4

Solution Photoshop

La suppression d'une section de l'image n'affecte que ce calque. Ce que vous voulez faire, c'est créer un canal séparé qui stocke vos informations alpha.

  1. Dans le panneau d'outils avec Calques / Canaux / Chemins, choisissez l'onglet Canaux. Ici, vous verrez RVB, rouge, vert et bleu.
  2. Créez un nouveau canal en utilisant le bouton en bas du panneau, c'est votre canal alpha. Il s'agit d'un canal en niveaux de gris 8 bits vous offrant 256 niveaux de transparence.
  3. Vous pouvez utiliser les petites icônes "œil" pour activer / désactiver ce canal.
  4. Dessinez ou copiez / collez vos informations dans la chaîne.

Remarque: lors de l'enregistrement, vous devez faire attention aux formats de fichiers. Des choses comme .Tiff et .TGA enregistrent le canal alpha complet indépendamment des informations de couleur. Cependant, Photoshop ne permet pas cela avec PNG, ce qui dérange beaucoup de nombreux développeurs. Il n'enregistrera pas correctement les images du canal alpha et aura tendance à supprimer les informations de couleur pour les zones entièrement transparentes afin de compresser la taille du fichier.

wkerslake
la source
C'était exactement mon problème. Je produisais en PNG et ne voyais aucune des qualités du canal "alpha". Merci, c'est parfait. Quelqu'un at-il des instructions pour utiliser Gimp de la même manière?
eli
1
C'est frustrant parce que le retour de la version 5.0 ou 5.5 de Photoshop enregistrerait en fait la chaîne complète sur les PNG. Adobe a changé la façon dont ils les ont traités pour les versions ultérieures du logiciel. Soupir ...
wkerslake
4

Je trouve que la meilleure façon de le faire dans The GIMP est d'utiliser un masque de calque (clic droit sur un calque et créer un masque).

Le calque sera alors associé à deux "images" - l'image RGBA et un masque de calque en niveaux de gris qui agit comme un canal alpha supplémentaire (multiplicatif). Vous pouvez cliquer sur l'une de ces images pour sélectionner celle qui sera modifiée.

Si vous maintenez CTRL et cliquez sur le masque de calque, vous verrez juste l'image RGBA (cela désactive le masque). Si vous maintenez la touche ALT enfoncée et cliquez sur le masque de calque, vous ne verrez que le masque de calque.

Lorsque vous exportez une image avec un masque de calque actif, l'image exportée conservera les informations de couleur même à partir des zones que le masque rend entièrement transparentes.

Pour vos besoins, vous pouvez trouver efficace de composer votre canal alpha sur un calque séparé (RGBA) - puis lorsque vous avez terminé, vous pouvez simplement copier ce calque dans le masque de calque du calque d'origine.

Andrew Russell
la source
C'est plus proche de ce dont j'ai besoin. Mais cela n'affecte que la couche supérieure! J'ai plusieurs calques dans mon image et j'aimerais pouvoir le faire sans l'aplatir. Merci de répondre.
eli
Ajoutez un calque de masque à chaque calque de votre image.
deft_code
2

Dans le GIMP, une façon serait de diviser l'image en couches pour chaque canal. Sélectionnez "Couleurs-> Composants-> Décomposer" et choisissez RGBA ou les canaux que vous souhaitez diviser en calques. Ensuite, modifiez vos canaux alpha et couleur individuels comme bon vous semble (ils doivent être en niveaux de gris), puis allez dans "Couleurs-> Composants-> Composer" choisissez la disposition de canal souhaitée et choisissez les calques à utiliser pour chaque canal.

Vous pouvez également utiliser la boîte de dialogue "Chaînes". Cela devrait faire partie des choses par défaut de la boîte à outils, mais sinon, vous pouvez sélectionner "Windows-> Dialogues ancrables-> Canaux". Vous pouvez basculer la visibilité de chaque canal de couleur, et en cliquant et en mettant en surbrillance les noms de canal, vous pouvez choisir ceux à modifier individuellement (il semble qu'il préserve la couleur avec alpha, bien que je ne vois pas de moyen de "masquer" l'alpha pendant modification sans masquer l'image entière ...).

Riley Adams
la source
il semble que je doive d'abord aplatir l'image, puis la décomposer, la modifier et la recomposer. Merci pour le conseil! Mais je cherche un moyen non destructif.
eli
Ahh, je supposais que vous travailliez avec une image monocouche afin que l'aplatissement ne soit pas nécessaire, mais peu importe alors. Bonne chance!
Riley Adams
2

Pour écrire votre propre processeur de contenu (comme suggéré par @Andrew Russell) spécifique à Unity3D, placez ce script dans votre Assets/Editordossier combinera n'importe quelle image *-Base.*avec un *-Alpha.*fichier du même nom et modifier la texture d'origine:

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);
            }
        }
    }
}

Adaptez-vous à vos propres conventions de dénomination des fichiers de ressources.

Warwick Allison
la source
0

Une alternative consiste à écrire votre propre processeur de contenu pour effectuer l'opération souhaitée. De cette façon, vous pourriez simplement donner à votre couche de "réflectivité" (ou même plusieurs couches de réflectivité) un nom spécial, et demander au processeur de contenu de mettre ces données dans le canal alpha pour vous. (Ou bien implémentez tout type de processus que vous aimez.)

Si vous utilisiez XNA et The GIMP (c'est ce que j'utilise et que je connais bien), il vous serait très facile d'ajouter cet importateur XCF à votre pipeline de contenu et d'apporter les modifications nécessaires pour traiter des couches spécialement nommées.

Comme vous utilisez Unity, pas XNA, je ne connais pas les options de pipeline de contenu dont vous disposez. Mais vous pouvez peut-être adapter le code lié pour qu'il fonctionne dans votre processus de contenu.

Andrew Russell
la source