GL ARB texture env combine: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(Verwendungsbeispiel)
K (Verwendungsbeispiel: Grammatik)
Zeile 536: Zeile 536:
  
 
== Verwendungsbeispiel ==
 
== 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 erreichen würde wenn man die Fläche mehrfach zeichnen (multi pass) würde und dabei als Blendfunktion GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA benutzen würde.
+
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 [[Blending|Blendfunktion]] GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA benutzt.
  
 
<pascal>var
 
<pascal>var

Version vom 4. November 2007, 22:48 Uhr

GL_ARB_texture_env_combine

Info DGL.png 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

GL_ARB_multitexture

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.

Ressourcen

Hardware Unterstützung
Original Extension-Spezifikation