glBlendFunc: Unterschied zwischen den Versionen
Flash (Diskussion | Beiträge) K (→Literatur) |
K |
||
Zeile 185: | Zeile 185: | ||
|} | |} | ||
</div> | </div> | ||
+ | |||
+ | |||
+ | == Sinnvolle Kombinationen == | ||
Version vom 16. Mai 2008, 16:51 Uhr
(weitere exzellente Artikel) |
Inhaltsverzeichnis
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_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR, GL_CONSTANT_ALPHA und GL_ONE_MINUS_CONSTANT_ALPHA,. 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. (Beispiel: Wenn man 8 Bit für eine Farbe (z.B. Rot) hat, dann ist kR = 2^8 - 1 = 255.)
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.
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.
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.
Nachfolgend finden Sie eine Übersicht einiger Blendergebnisse. Der Code blieb unverändert, nur die Blendfunktion wurde geändert.
code | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
glClearColor(1.0,1.0,1.0,0.0); [...] glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); glBegin(GL_QUADS); glColor4f(0.8,0.2,0.2,0.7); glVertex3f(-1, 1, 1); glVertex3f(-1,-1, 1); glVertex3f( 1,-1, 1); glVertex3f( 1, 1, 1); glColor4f(0.2,0.8,0.2,0.5); glVertex3f(-1, 1, 1.5); glVertex3f(-1,-1, 1.5); glVertex3f( 1,-1, 1.5); glVertex3f( 1, 1, 1.5); glColor4f(0.2,0.2,0.8,0.3); glVertex3f(-1, 1, 2); glVertex3f(-1,-1, 2); glVertex3f( 1,-1, 2); glVertex3f( 1, 1, 2); glEnd; | ||||||||||||||
|
Sinnvolle Kombinationen
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