glBlendFunc

Aus DGL Wiki
Wechseln zu: Navigation, Suche

glBlendFunc


Name

glBlendFunc - Setzt bestimmte Pixel-Berechnungen.


Delphi-Spezifikation

procedure glBlendFunc(sfactor : TGLEnum; dfactor: TGLEnum);


Parameter

sfactor Gibt an, wie der Rot-, Grün-, Blau- und Alphaanteil des Quell-Blendfaktors berechnet wird. Folgende symbolische Konstanten sind erlaubt : GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_CONSTANT_COLOR_EXT, GL_ONE_MINUS_CONSTANT_COLOR_EXT, GL_CONSTANT_ALPHA_EXT, GL_ONE_MINUS_CONSTANT_ALPHA_EXT und GL_SRC_ALPHA_SATURATE. Vorgabewert ist GL_ONE.
dfactor Gibt an, wie der Rot-, Grün-, Blau- und Alphaanteil des Ziel-Blendfaktors berechnet wird. Folgende symbolische Konstanten sind erlaubt : GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_CONSTANT_COLOR_EXT, GL_ONE_MINUS_CONSTANT_COLOR_EXT, GL_CONSTANT_ALPHA_EXT und GL_ONE_MINUS_CONSTANT_ALPHA_EXT. Vorgabewert ist GL_ZERO.


Beschreibung

Im RGBA-Modus, können Pixel so gezeichnet werden, dass anhand einer Funktion die ankommenden RGBA-Werte (Quelle) mit dem bereits im Framepuffer befindlichen RGBA-Werten (Ziel) gemischt werden. Mischung ist als Vorgabe deaktiviert, kann jedoch mit glEnable/glDisable und dem Token GL_BLEND gesteuert werden.

glBlendFunc beschreibt die Funktion der Mischung, sofern aktiviert. sfactor gibt dabei an welche Methode genutzt wird um die Quellfarbkomponenten zu skalieren. dfactor gibt an, welche der Methode genutzt wird um die Zielfarbkomponenten zu skalieren. Die möglichen Methoden werden in der folgenden Tabelle beschrieben, wobei jede insgesamt vier Skalierungsfaktoren besitzt, für die vier Komponenten einer RGBA-Farbe.

In der Tabelle (und allen folgenden Gleichungen), werden Quell- bzw. Zielfarbkomponenten als (Rs, Gs, Bs, As) und (Rd, Gd, Bd, Ad) dargestellt. Diese Komponenten besitzen Ganzzahlwerte, die zwischen 0 und (kR, kG, kB, kA) liegen, wobei

kc = 2^mc - 1;

und (mR, mG, mB, mA) gleich der Zahl der Rot-, Grün-, Blau- und Alphabitflächen ist.

Konstante Farbkomponenten werden als (Rc, Gc, Bc, Ac) angegeben und werden nicht mit (kR, kG, kB, kA) skaliert, da sie bereits im Intervall [0,1] liegen.

Quell- und Zielskalierungsfaktoren werden als (sR, sG, sB, sA) und (dR, dG, dB, dA) angegeben. Die in der Tabelle beschriebenen Skalierungsfaktoren, angegeben als (fR, fG, fB, fA) repräsentieren entweder Quell- oder Zielfaktoren. Alle Skalierungsfaktoren liegen im Intervall [0,1].

Parameter (fR, fG, fB, fA)
GL_ZERO (0,0,0,0)
GL_ONE (1,1,1,1)
GL_SRC_COLOR (Rs/kR, Gs/kG, Bs/kB, As/kA)
GL_ONE_MINUS_SRC_COLOR (1,1,1,1) - (Rs/kR, Gs/kG, Bs/kB, As/kA)
GL_DST_COLOR (Rd/kR, Gd/kG, Bd/kB, Ad/kA)
GL_ONE_MINUS_DST_COLOR (1,1,1,1) - (Rd/kR, Gd/kG, Bd/kB, Ad/kA)
GL_SRC_ALPHA (As/kA, As/kA, As/kA, As/kA)
GL_ONE_MINUS_SRC_ALPHA (1,1,1,1) - (As/kA, As/kA, As/kA, As/kA)
GL_DST_ALPHA (Ad/kA, Ad/kA, Ad/kA, Ad/kA)
GL_ONE_MINUS_DST_ALPHA (1,1,1,1) - (Ad/kA, Ad/kA, Ad/kA, Ad/kA)
GL_SRC_ALPHA_SATURATE (i,i,i,1)
GL_CONSTANT_COLOR_EXT (Rc, Gc, Bc, Ac)
GL_ONE_MINUS_CONSTANT_COLOR_EXT (1,1,1,1) - (Rc, Gc, Bc, Ac)
GL_CONSTANT_ALPHA_EXT (Ac, Ac, Ac, Ac)
GL_ONE_MINUS_CONSTANT_ALPHA_EXT (1,1,1,1) - (Ac, Ac, Ac, Ac)

In der Tabelle ist

i = min(As, kA - Ad) /kA

Um die gemischten RGBA-Werte eines Pixels im RGBA-Modus zu ermitteln, nutzt das System folgende Gleichungen (wenn die Mischungs-Gleichung Erweiterung nicht unterstützt wird) :

Rd = min(kR, RssR + RddR)
Gd = min(kG, GssG + GddR)
Bd = min(kB, BssB + BddB)
Ad = min(kA, AssB + AddA)

Trotz der offensichtlichen Präzisions obiger Gleichungen, ist die Mischungsarithmetik nicht exakt spezifiziert, aufgrund Mischungsoperationen mit unpräzisen Ganzzahlwerten. Bei einem Mischungsfaktor von 1 ist jedoch garantiert, dass dieser seinen Mulitplikanten nicht verändert, und ein Mischungsfaktor gleich 0 verrringert seinen Multiplikanten auf 0. Wenn sfactor z.B. GL_SCR_ALPHA ist, und dfactor gleich GL_ONE_MINUS_SRC_ALPHA, dann ist As gleich kA, und die Funktionen können auf ihre einfache Entsprechung reduziert werden :

Rd = Rs
Gd = Gs
Bd = Bs
Ad = As

Wenn die Erweiterung für Mischungsgleichungen vorhanden ist, werden die gemischten RGBA-Werte anhand der gesetzten Mischungsgleichung gesetzt. Siehe dazu glBlendEquation.


Beispiele

Transparenz implementiert man am besten mit den Mischungsfunktionen (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) und Sortierung der Primitiven von hinten nach vorne.

Die Mischungsfunktion(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ist auch zum Rendern kantengeglätteter Punkte nützlich, egal in welcher Reihenfolge diese vorkommen.

Kantenglättung von Polygonen lässt sich mit der Mischungsfunktion (GL_SRC_ALPHA_SATURATE, GL_ONE) optimieren, wobei die Polygone von vorne nach hinten sortiert werden.


Hinweise

Der Alpha-Eingangswert (Quelle) kann im Endeffekt als Materialdurchlässigkeit betrachtet werden, reichend von KA = 1, also komplett solide, bis KA=0, was ein komplett transparentes (=unsichtbares) Material darstellen würde.

Wenn mehr als ein Farbpuffer zum Rendern aktiv ist, wird die GL für jeden dieser Puffer separat Mischung durchführen, unter Nutzung des entsprechenden Pufferinhaltes als Zielkomponente. Siehe glDrawBuffer.

Mischung funktioniert übrigens nur im RGBA-Modus. Im Farbindex-Modus nicht.


Fehlermeldungen

GL_INVALID_ENUM wird generiert, wenn sfactor oder dfactor keine gültigen Werte darstellen.

GL_INVALID_OPERATION wird generiert, wenn glBlendFunc in einem glBegin-glEnd Block aufgerufen wird.


Zugehörige Wertrückgaben

glGet mit dem Argument GL_BLEND_SRC.
glGet mit dem Argument GL_BLEND_DST.
glGet mit dem Argument GL_BLEND_COLOR_EXT.
glIsEnabled mit dem Argument GL_BLEND.


Siehe auch

glAlphaFunc, glClear, glBlendEquation, glBlendFuncSeparate, glDrawBuffer, glEnable, glLogicOp, glStencilFunc


Literatur

RedBook Kapitel 7