GL ARB texture env combine: Unterschied zwischen den Versionen
Flash (Diskussion | Beiträge) K (→Verwendungsbeispiel: Grammatik) |
Traude (Diskussion | Beiträge) K (→Ressourcen: Spezifikations-Link berichtigt) |
||
Zeile 588: | Zeile 588: | ||
== Ressourcen == | == Ressourcen == | ||
[http://www.delphi3d.net/hardware/extsupport.php?extension=GL_ARB_texture_env_combine Hardware Unterstützung]<br> | [http://www.delphi3d.net/hardware/extsupport.php?extension=GL_ARB_texture_env_combine Hardware Unterstützung]<br> | ||
− | [http:// | + | [http://opengl.org/registry/specs/ARB/texture_env_combine.txt Original Extension-Spezifikation] |
Version vom 12. Juli 2008, 09:58 Uhr
Inhaltsverzeichnis
GL_ARB_texture_env_combine
Die Orginalspezifikation finden Sie unter "Ressourcen" am Ende des Artikels. |
Abfragestring
GL_ARB_texture_env_combine
Abhängigkeiten
Diese Extension baut auf OpenGL 1.1 auf und ist abhängig von der OpenGL 1.2.1 Extension GL_ARB_multitexture.
Beschreibung
Diese Extension ist eine wichtige Erweiterung für Multitexturing. Sie erlaubt es zu bestimmen wie die Farbwerte und Alphawerte von 2 oder mehreren Texturen kombiniert werden soll.
Für jede Texture stage können hierbei die Berechnung die durchgeführt werden sollen angegeben werden. Zuerst wird die Berechnung für die 0. Texture stage durchgeführt, dann die Berechnungen für die 1. und so weiter, bis die letzte Texture stage das Ergebnis an die nächste Stufe der Rendering Pipeline weiter gibt.
Verwendung
Man muss OpenGL für jede Texture stage mitteilen, dass diese Extension verwendet werden soll. Dies wird mittels
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
gemacht. Nun muss sowohl für den Alphawert, als auch für den Farbwert festgelegt werden, welcher Art die Kombinierung sein soll.
Kombinierungsarten
Art | Formel |
GL_REPLACE | Arg0 |
GL_MODULATE | Arg0 * Arg1 |
GL_ADD | Arg0 + Arg1 |
GL_ADD_SIGNED_ARB | Arg0 + Arg1 - 0.5 |
GL_SUBTRACT_ARB | Arg0 - Arg1 |
GL_INTERPOLATE_ARB | Arg0 * (Arg2) + Arg1 * (1-Arg2) |
gesetzt wird die Kombinierungsart mittels:
glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, KOMBINIERUNGSART);
für die Farbwerte bzw. mit
glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, KOMBINIERUNGSART);
für die Alphawerte. Nun müssen noch die Operanden Arg0, Arg1 und Arg2 für die Kombinierung gesetzt werden.
Operanden
Für das setzen eines Operanden werden 2 Informationen benötigt. Zum einen die Quelle (Source) der Information, wofür es folgende Möglichkeiten gibt:
Quelle | Beschreibung |
GL_PRIMARY_COLOR_ARB | Farbwert der mit glColor oder vergleichbarem gesetzt wurde. |
GL_TEXTURE | Wert der aktuellen Textur (in der aktuellen Texture stage) |
GL_CONSTANT_ARB | Wert der mit glTexEnvfv] für die aktuelle Textur gesetzt wurde. |
GL_PREVIOUS_ARB | Ergebnis der Berechnungen aus der vorherigen Texture stage, oder gleich wie GL_PRIMARY_COLOR_ARB, wenn es sich um die aller erste Texture stage handelt. |
nun erfolgt noch die Unterscheidung für welchen Operanden (Arg0, Arg1 oder Arg2) der Wert gesetzt werden soll, und ob dieser Operand für die RGB- oder Alphawert Berechnung verwendet werden soll. Hier gibt es folgende Möglichkeiten:
Art der Quelle | Beschreibung |
GL_SOURCE0_RGB_ARB | Wert für Arg0 in der RGB Berechnung setzen |
GL_SOURCE1_RGB_ARB | Wert für Arg1 in der RGB Berechnung setzen |
GL_SOURCE2_RGB_ARB | Wert für Arg2 in der RGB Berechnung setzen |
GL_SOURCE0_ALPHA_ARB | Wert für Arg0 in der Alpha Berechnung setzen |
GL_SOURCE1_ALPHA_ARB | Wert für Arg1 in der Alpha Berechnung setzen |
GL_SOURCE2_ALPHA_ARB | Wert für Arg2 in der Alpha Berechnung setzen |
gesetzt werden diese Werte nun mit
glTexEnvi( GL_TEXTURE_ENV, Art der Quelle, Quelle );
Nun weiß OpenGL welchen Wert er für die Berechnung nehmen soll, jedoch muss man auch noch angeben Welcher Teil des Wertes verwendet werden soll. Für die RGB Berechnung hat man hier folgende Möglichkeiten:
Operand RGB-Berechnung | Beschreibung |
GL_SRC_COLOR | Verwende RGB Teil des Wertes |
GL_ONE_MINUS_SRC_COLOR | Verwende 1-RGB Teil des Wertes |
GL_SRC_ALPHA | Verwende Alpha Teil des Wertes |
GL_ONE_MINUS_SRC_ALPHA | Verwende 1-Alpha Teil des Wertes |
Da RGB 3 Werte sind und Alpha nur 1 Wert gibt es für die Alphaberechnung nur 2 Arten von Operanden:
Operand Alphaberechnung | Beschreibung |
GL_SRC_ALPHA | Verwende Alpha Teil des Wertes |
GL_ONE_MINUS_SRC_ALPHA | Verwende 1-Alpha Teil des Wertes |
Um anzugeben wofür der Operand eingesetzt werden soll muss man noch wählen zwischen:
Art des Operanden | Beschreibung |
GL_OPERAND0_RGB_ARB | Operand für Arg0 in der RGB Berechnung setzen |
GL_OPERAND1_RGB_ARB | Operand für Arg1 in der RGB Berechnung setzen |
GL_OPERAND2_RGB_ARB | Operand für Arg2 in der RGB Berechnung setzen |
GL_OPERAND0_ALPHA_ARB | Operand für Arg0 in der Alpha Berechnung setzen |
GL_OPERAND1_ALPHA_ARB | Operand für Arg1 in der Alpha Berechnung setzen |
GL_OPERAND2_ALPHA_ARB | Operand für Arg2 in der Alpha Berechnung setzen |
gesetzt werden diese Werte nun mit
glTexEnvi]( GL_TEXTURE_ENV, Art des Operanden, Operand Alphaberechnung bzw. Operand RGB-Berechnung );
Scalen
Am Ende der Berechnung einer Texture stage kann der errechnete Wert noch mit einem Scale Faktor multipliziert werden, und zwar mittels
glTexEnvf( GL_TEXTURE_ENV, RGB_SCALE_ARB, Faktor );
Gültige Werte für Faktor sind hier jedoch nur 1.0, 2.0 oder 4.0. Am Ende Wird das Ergebnis noch auf den Wertebereich [0|1] gebracht. Zu hohe oder zu niedrige Werte werden mit 1.0 bzw. mit 0.0 ersetzt.
Neue Tokens
Neue Parameterwerte
Für glTexEnv wenn pname GL_TEXTURE_ENV_MODE ist, dann ist für param folgender zustäzlicher Wert gültig:
GL_COMBINE_ARB | 0x8570 | Diese Extension wird für diese Texture stage aktiviert |
Für glTexEnv wenn target TEXTURE_ENV ist, dann sind für pname folgende zustäzliche Werte gültig:
GL_COMBINE_RGB_ARB | 0x8571 | Berechnungsart für RGB angeben |
GL_COMBINE_ALPHA_ARB | 0x8572 | Berechnungsart für Alpha angeben |
GL_SOURCE0_RGB_ARB | 0x8580 | Quelle für Arg0 der RGB Berechnung angeben |
GL_SOURCE1_RGB_ARB | 0x8581 | Quelle für Arg1 der RGB Berechnung angeben |
GL_SOURCE2_RGB_ARB | 0x8582 | Quelle für Arg2 der RGB Berechnung angeben |
GL_SOURCE0_ALPHA_ARB | 0x8588 | Quelle für Arg0 der Alpha Berechnung angeben |
GL_SOURCE1_ALPHA_ARB | 0x8589 | Quelle für Arg1 der Alpha Berechnung angeben |
GL_SOURCE2_ALPHA_ARB | 0x858A | Quelle für Arg2 der Alpha Berechnung angeben |
GL_OPERAND0_RGB_ARB | 0x8590 | Teil der Quelle für Arg0 der RGB Berechnung angeben |
GL_OPERAND1_RGB_ARB | 0x8591 | Teil der Quelle für Arg1 der RGB Berechnung angeben |
GL_OPERAND2_RGB_ARB | 0x8592 | Teil der Quelle für Arg2 der RGB Berechnung angeben |
GL_OPERAND0_ALPHA_ARB | 0x8598 | Teil der Quelle für Arg0 der Alpha Berechnung angeben |
GL_OPERAND1_ALPHA_ARB | 0x8599 | Teil der Quelle für Arg1 der Alpha Berechnung angeben |
GL_OPERAND2_ALPHA_ARB | 0x859A | Teil der Quelle für Arg2 der Alpha Berechnung angeben |
GL_RGB_SCALE_ARB | 0x8573 | Scale Faktor für RGB Berechnung angeben |
GL_ALPHA_SCALE | Scale Faktor für Alpha Berechnung angeben |
Für glTexEnv wenn pname GL_COMBINE_RGB_ARB oder GL_COMBINE_ALPHA_ARB ist, dann sind für param folgende Werte gültig:
GL_REPLACE | Arg0 | |
GL_MODULATE | Arg0 * Arg1 | |
GL_ADD | Arg0 + Arg1 | |
GL_ADD_SIGNED_ARB | 0x8574 | Arg0 + Arg1 - 0.5 |
GL_INTERPOLATE_ARB | 0x8575 | Arg0 * (Arg2) + Arg1 * (1-Arg2) |
GL_SUBTRACT_ARB | 0x84E7 | Arg0 - Arg1 |
Für glTexEnv wenn pname GL_SOURCE0_RGB_ARB, GL_SOURCE1_RGB_ARB, GL_SOURCE2_RGB_ARB, GL_SOURCE0_ALPHA_ARB, GL_SOURCE1_ALPHA_ARB, oder GL_SOURCE2_ALPHA_ARB ist, dann sind für param folgende Werte gültig:
GL_TEXTURE | Aktuelle Textur als Quelle verwenden | |
GL_CONSTANT_ARB | 0x8576 | Mit glTexEnv für diese Textur gesetzte Farbe als Quelle verwenden |
GL_PRIMARY_COLOR_ARB | 0x8577 | Mit glColor oder vergleichbarem gesetzte Farbe als Quelle verwenden |
GL_PREVIOUS_ARB | 0x8578 | Ergebnis der vorigen Texture Stage als Quelle verwenden oder gleich wie GL_PRIMARY_COLOR_ARB wenn es die erste Texture stage ist. |
Für glTexEnv wenn pname GL_OPERAND0_RGB_ARB, GL_OPERAND1_RGB_ARB oder GL_OPERAND2_RGB_ARB ist, dann sind für param folgende Werte gültig:
SRC_COLOR | RGB Teil der Quelle als Operand verwenden | |
GL_ONE_MINUS_SRC_COLOR | 1-RGB Teil der Quelle als Operand verwenden | |
GL_SRC_ALPHA | Alpha Teil der Quelle als Operand verwenden | |
GL_ONE_MINUS_SRC_ALPHA | 1-Alpha Teil der Quelle als Operand verwenden |
Für glTexEnv wenn pname GL_OPERAND0_ALPHA_ARB, GL_OPERAND1_ALPHA_ARB oder GL_OPERAND2_ALPHA_ARB ist, dann sind für param folgende Werte gültig:
GL_SRC_ALPHA | Alpha Teil der Quelle als Operand verwenden | |
GL_ONE_MINUS_SRC_ALPHA | 1-Alpha Teil der Quelle als Operand verwenden |
Für glTexEnv wenn pname GL_RGB_SCALE_ARB oder GL_ALPHA_SCALE ist, dann sind für param folgende Werte gültig:
1.0 |
2.0 |
4.0 |
Neue States
Name | Abfrage mit | Initialwert |
GL_COMBINE_RGB_ARB | GetTexEnviv | GL_MODULATE |
GL_COMBINE_ALPHA_ARB | GetTexEnviv | GL_MODULATE |
GL_SOURCE0_RGB_ARB | GetTexEnviv | GL_TEXTURE |
GL_SOURCE1_RGB_ARB | GetTexEnviv | GL_PREVIOUS_ARB |
GL_SOURCE2_RGB_ARB | GetTexEnviv | GL_CONSTANT_ARB |
GL_SOURCE0_ALPHA_ARB | GetTexEnviv | GL_TEXTURE |
GL_SOURCE1_ALPHA_ARB | GetTexEnviv | GL_PREVIOUS_ARB |
GL_SOURCE2_ALPHA_ARB | GetTexEnviv | GL_CONSTANT_ARB |
GL_OPERAND0_RGB_ARB | GetTexEnviv | GL_COLOR |
GL_OPERAND1_RGB_ARB | GetTexEnviv | GL_COLOR |
GL_OPERAND2_RGB_ARB | GetTexEnviv | GL_ALPHA |
GL_OPERAND0_ALPHA_ARB | GetTexEnviv | GL_ALPHA |
GL_OPERAND1_ALPHA_ARB | GetTexEnviv | GL_ALPHA |
GL_OPERAND2_ALPHA_ARB | GetTexEnviv | GL_ALPHA |
GL_RGB_SCALE_ARB | GetTexEnvfv | 1.0 |
GL_ALPHA_SCALE | GetTexEnvfv | 1.0 |
Abhängigkeiten
Verwendungsbeispiel
Folgendender Code benutzt Multitexturing und texture_env_combine um über die erste Textur eine Zweite zu blenden. Die zweite Textur wird dabei mit einem Alphawert verrechnet. Das Ganze entspricht vom Ergebniss dem was man erreicht, wenn man die Fläche mehrfach zeichnet (multi pass) und dabei als Blendfunktion GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA benutzt.
var Color: array [0..3] of single; begin glActiveTexture(GL_TEXTURE0); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); fTex.Bind;
Die erste Textur kann ganz normal an die TMU0 gebunden werden.
glActiveTexture(GL_TEXTURE1); fCube.Bind;
Die Zweite Textur wird auch normal gebunden.
Color[0] := 0; Color[1] := 0; Color[2] := 0; Color[3] := 0.125; glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, @Color);
Damit wird die Farbe gesetzt. Aus dieser Farbe wird im aktuellen Beispiel aber lediglich der Alphakanal benutzt.
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
texture_env_combine aktivieren.
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
Die Kombinierungsart festlegen. Nähere informationen dazu wurden bereits oben beschrieben.
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, GL_CONSTANT);
Die einzelnen Operanden festlegen. Dieses richten sich nach der Kombinierungsart.
glBegin(GL_QUADS); glTexCoord2f(0, 1); glVertex3f(- 2, - 2, 0); ... glEnd;
Objekte zeichnen. In diesem Fall nur eine simple Fläche.
glActiveTexture(GL_TEXTURE1); fCube.Unbind; glActiveTexture(GL_TEXTURE0); fTex.Unbind; end;
Die Texturen wieder aus dem TMUs entbinden.
Mit diesem Code lässt sich auch auf Objekten eine leichte Spiegelung der Umgebung erzeugen. Dazu muss für die zweite Textur lediglich eine CubeMap oder SphereMap benutzt werden.