Question

Je joue avec des manuels (walk-les-pixels) traitement d'image, et je recréer le standard mélange « overlay ». Je regarde les macros « mathématiques » Photoshop ici:

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

Les deux images sources sont en RGBA assez standard (8 bits) format, tout comme la destination. Lorsque les deux images sont entièrement opaque (alpha est de 1,0), le résultat est mélangé correctement comme prévu:

Mais si ma couche « mélange » (l'image en haut) a la transparence dans, je suis un peu déconcerté à comment facteur alpha dans l'équation de mélange correctement. Je pense qu'il fonctionne de telle sorte que des pixels transparents dans la couche de mélange sont sans effet sur le résultat, des pixels opaques dans la couche de mélange faire le mélange de revêtement en tant que normale, et semi-transparentes pixels de la couche de mélange ont un effet écaillé sur le résultat.

Quelqu'un peut-il me expliquer les équations de mélange ou le concept derrière le faire?

Les points bonus si vous pouvez me aider à le faire de telle sorte que l'image résultante a correctement prémultipliées alpha (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??
Était-ce utile?

La solution

Juste une supposition, mais je voudrais essayer

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

Autres conseils

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;

J'utilise ceci pour « overlay » mélange d'une couleur de base opaque et une texture de mélange qui présente un grand nombre de (semi) pixels transparents.

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, alors que le résultat Prémultiplier avec l'alpha de base.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top