Question

J'ai un certain nombre de pixels RGBA, chacun d'eux ayant une composante alpha.

J'ai donc une liste de pixels: ( p0 p1 p2 p3 ... pn ) où p_0_ est le pixel avant et p_n_ le plus éloigné (à l'arrière).

Le dernier pixel (ou n’importe lequel) n’est pas nécessairement opaque. Par conséquent, le pixel mélangé obtenu peut également être transparent. Je fusionne du début à la fin de la liste, pas l'inverse (oui, c'est du lancer de rayons). Donc, si le résultat devient suffisamment opaque à tout moment, je peux m'arrêter avec un résultat correct. Je vais appliquer l’algorithme de fusion de la manière suivante: ((((em> p0 @ p1 ) @ @ em> p2 ) @ @ em> p3 ) ...)

Quelqu'un peut-il me suggérer une formule de mélange correcte non seulement pour R, G et B, mais également pour le composant A?

UPD : Je me demande comment il est possible que, pour un processus de mélange de couleurs déterminé, nous puissions avoir de nombreuses formules. Est-ce une sorte d'approximation? Cela me semble fou: les formules ne sont pas si différentes que nous gagnons réellement en efficacité ou en optimisation. Quelqu'un peut-il clarifier cela?

Était-ce utile?

La solution

Le mélange alpha est l’un de ces sujets qui a plus de profondeur que vous ne le pensez. Cela dépend de la signification de la valeur alpha dans votre système, et si vous avez tort, vous obtiendrez des résultats qui semblent bons, mais qui affichent des artefacts étranges.

Découvrez le papier classique de Porter et Duff & Compositing Digital Images . ; pour une grande discussion lisible et toutes les formules. Vous voulez probablement que le "& over; over" soit opérateur.

On dirait que vous faites quelque chose de plus proche du rendu du volume. Pour une formule et des références, voir la FAQ sur les graphiques , question 5.16 " Comment puis-je effectuer un rendu de volume? " ;.

Autres conseils

Il existe différentes manières de procéder, en fonction de la manière dont les valeurs RGBA représentent réellement les propriétés des matériaux.

Voici un algorithme possible. Commencez avec les couleurs finales des pixels lightr = lightg = lightb = 0 , lightleft = 1 ;

Pour chaque r, g, b, un pixel rencontré évalue:

lightr += lightleft*r*(1-a)
lightg += lightleft*g*(1-a)
lightb += lightleft*b*(1-a)
lightleft *= 1-a;

(Les valeurs RGBA sont normalisées entre 0 et 1, et je suppose que a = 1 signifie opaque, a = 0 signifie totalement transparent)

Si le premier pixel rencontré est bleu avec une opacité de 50%, 50% de la couleur disponible est définie sur bleu et le reste inconnu. Si un pixel rouge avec une opacité de 50% est le suivant, 25% de la lumière restante sont réglés en rouge, de sorte que le pixel contient 50% de bleu et 25% de rouge. Si un pixel vert avec une opacité de 60% est le suivant, il est composé de 50% de bleu, 25% de rouge et 15% de vert, avec 10% de la lumière restante.

Les matériaux physiques qui correspondent à cette fonction sont des matériaux émetteurs de lumière mais partiellement opaques: ainsi, un pixel au milieu de la pile ne peut jamais assombrir la couleur finale: il ne peut empêcher la lumière derrière elle d'augmenter la couleur finale ( en étant noir et complètement opaque).

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