2011-01-14 6 views
3

Je suis en train de jouer avec un traitement d'image manuel (marchez sur les pixels), et je recrée le mélange standard de "superposition". Je regarde les macros ici "mathématiques Photoshop":Comment gérer l'alpha dans une opération de fusion manuelle "Overlay"?

http://www.nathanm.com/photoshop-blending-math/ (See also here pour la version plus lisible de superposition)

Les deux images sources sont en RGBA assez standard (8 bits) format, tout comme le destination. Lorsque les deux images sont complètement opaques (alpha est 1.0), le résultat est correctement mélangé comme prévu:

Mais si mon calque "blend" (l'image du haut) a de la transparence, je suis un peu déconcerté quant à comment factoriser cet alpha dans l'équation de mélange correctement. Je m'attends à ce que cela fonctionne de sorte que les pixels transparents dans la couche de fusion n'affectent pas le résultat, les pixels opaques dans la couche de fusion font le mélange de superposition comme normal, et les pixels de couche de mélange semi-transparent ont un effet réduit sur le résultat. Est-ce que quelqu'un peut m'expliquer les équations de mélange ou le concept derrière cela?

points bonus si vous pouvez me aider à le faire de telle sorte que l'image résultante a alpha correctement prémultipliée (qui ne joue que pour les pixels qui ne sont pas opaques dans les deux couches, je pense.)

Merci!

// factor in blendLayerA, (1-blendLayerA) somehow? 
resultR = ChannelBlend_Overlay(baseLayerR, blendLayerR); 
resultG = ChannelBlend_Overlay(baseLayerG, blendLayerG); 
resultB = ChannelBlend_Overlay(baseLayerB, blendLayerB); 
resultA = 1.0; // also, what should this be?? 

Répondre

0

Juste une supposition, mais je voudrais essayer

resultA = 1 - (1-baseAlpha) * (1-blendAlpha) 
+0

OK, quelle est la justification? Merci. –

+0

@quixoto Eh bien, je veux multiplier les deux pour les avoir tous les deux dans l'équation, sans atteindre trop tôt l'opacité lors de la combinaison des calques transparents (ce qui arriverait en les ajoutant). Mais multiplier le mettra presque à zéro, l'un d'entre eux est proche de zéro. Ainsi, j'inverse le tout, et il "se sent bien" pour les valeurs de test (comme 0, 0.5, 1) – Timbo

0

J'expérimentait cette question exactement, jusqu'à ce que j'ai découvert que le mieux est d'avoir la base et la couche de mélange à la fois avec alpha droit , puis prémultipliez seulement le résultat avec l'alpha de base.

2

Après le mélange de la couleur de base et la couleur de fusion, mélanger la couleur de base d'origine et la couleur résultant du mélange en utilisant l'alpha de la couleur de fusion:

vec4 baseColor = ...; 
vec4 blendColor = ...; 
vec4 blendedColor = blend(baseColor, blendColor); 
vec4 fragmentColor = (1.0 - blendColor.a) * baseColor + blendColor.a * blendedColor; 

je l'utiliser pour « overlay » mélange d'un couleur de base opaque et une texture de mélange qui a beaucoup de pixels (semi) transparents.

Questions connexes