Frage

ich eine Reihe von RGBA Pixel aufweisen, von denen jeweils eine alpha-Komponente.

So habe ich eine Liste von Pixeln. ( p0 p1 p2 p3 p4 ... pn ), wo p_0_ ist das vordere Pixel und p_n_ ist die am weitesten (hinten)

Das letzte (oder überhaupt) Pixel ist nicht notwendig, undurchsichtig, so dass der resultierende gemischte Pixel kann auch irgendwie transparent sein. Ich bin von Anfang an von der Liste bis zum Ende Mischen, nicht umgekehrt (ja, es ist Raytracing). Also, wenn das Ergebnis in jedem Moment undurchsichtig genug wird, kann ich mit dem richtigen genug Ergebnis stoppen. Ich werde den Mischalgorithmus auf diese Weise anwenden: (((( p0 @ p1 ) @ p2 ) @ p3 ) ...)

Kann jemand empfehlen, mir eine richtige Mischungsformel nicht nur für R, G und B, aber für eine Komponente auch?

UPD : Ich frage mich, wie es möglich ist, dass für den entschlossenen Prozess der Vermischung Farben, die wir viele Formeln haben können? Ist es eine Art von aproximation? Das sieht verrückt, wie für mich: Formeln sind nicht so unterschiedlich, dass wir gewinnen Effizienz und Optimierung wirklich. Kann das jemand erklären?

War es hilfreich?

Lösung

Alpha-Blending ist eines jener Themen, die mehr Tiefe, als Sie vielleicht denken. Es hängt davon ab, was der Alpha-Wert bedeutet, in Ihrem System, und wenn Sie falsch raten, dann werden Sie mit den Ergebnissen am Ende, die Art von gut aussehen, aber das Display seltsame Artefakte.

Schauen Sie sich Porter und Duff klassisches Papier " Compositing Digital Images " für eine große, gut lesbare Diskussion und alle Formeln. Sie wollen wahrscheinlich die "über" Operator.

Es klingt wie Sie etwas näher an Volumen-Rendering tun. siehe für eine Formel und Referenzen, die Graphics FAQ , fragt 5.16 „Wie ich führe Volume-Rendering?“.

Andere Tipps

Es gibt verschiedene Möglichkeiten, dies zu tun, je nachdem, wie die RGBA-Werte repräsentierten tatsächlich die Eigenschaften der Materialien.

Hier ist ein möglicher Algorithmus. Beginnen Sie mit der endgültigen Pixelfarben lightr=lightg=lightb=0, lightleft=1;

Für jedes r, g, b, ein Pixel angetroffen auszuwerten:

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

(Die RGBA-Werte werden normiert zwischen 0 und 1, und gehe ich davon aus, daß a = 1 bedeutet, opake, a = 0 bedeutet, vollständig transparent)

Wenn der erste angetroffen Pixel mit 50% Opazität blau ist, dann 50% der verfügbaren Farbe auf blau gesetzt, und der Rest nicht bekannt. Wenn ein rotes Pixel mit 50% Opazität ist nächste, dann 25% der verbleibenden Licht auf rot gesetzt, so hat das Pixel 50% blau, 25% Erm. Wenn ein grünes Pixel mit 60% Opazität nächsten ist, dann ist das Pixel 50% blau, 25% rot, 15% grün, mit 10% des Lichts bleibt.

Die physikalischen Materialien, die für diese Funktion entsprechen, sind Licht emittierende aber teilweise opake Materialien: Somit wird ein Pixel in der Mitte des Stapels niemals die endgültige Farbe verdunkeln: es nur Licht hinter sich aus der Erhöhung der Endfarbe verhindern kann ( von schwarz und völlig undurchsichtig ist).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top