glAlphaFunc: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Bot: konvertiere/korrigiere <BR>)
K (Der Ausdruck ''<pascal>(.*?)</pascal>'' wurde ersetzt mit ''<source lang="pascal">$1</source>''.)
 
(5 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 9: Zeile 9:
  
 
== Delphi-Spezifikation ==
 
== Delphi-Spezifikation ==
procedure '''glAlphaFunc'''(''func'' : TGLenum; ''ref'' : TGLclampf);
+
procedure '''glAlphaFunc'''(''func'' : TGLenum; ''ref'' : TGLclampf);
  
  
  
 
== Parameter ==
 
== Parameter ==
<table border=1 rules=all>
+
{| border="1" rules="all"
<tr>
+
! ''func''
<td>''func''</td>
+
| Legt den Alpha-Vergleich für die Funktion fest. Gültig sind hier die Konstanten '''GL_NEVER''', '''GL_LESS''', '''GL_EQUAL''', '''GL_LEQUAL''', '''GL_GREATER''', '''GL_NOTEQUAL''', '''GL_GEQUAL''', und '''GL_ALWAYS''' (Vorgabe).
<td>Legt den Alpha-Vergleich für die Funktion fest. Gültig sind hier die Konstanten '''GL_NEVER''', '''GL_LESS''', '''GL_EQUAL''', '''GL_LEQUAL''', '''GL_GREATER''', '''GL_NOTEQUAL''', '''GL_GEQUAL''', und '''GL_ALWAYS''' (Vorgabe).</td>
+
|-
</tr>
+
! ''ref''
<tr>
+
| Gibt an mit welchem Referenzwert die ankommenden Alphawerte verglichen werden. Dieser Wert wird in die Reichweite 0 bis 1 angepasst, wobei 0 (Vorgabe) für den niedrigsten möglichen Alphawert steht und 1 für den höchsten.
<td>''ref''</td>
+
|}
<td>Gibt an mit welchem Referenzwert die ankommenden Alphawerte verglichen werden. Dieser Wert wird in die Reichweite 0 bis 1 angepasst, wobei 0 (Vorgabe) für den niedrigsten möglichen Alphawert steht und 1 für den höchsten.</td>
 
</tr>
 
</table>
 
  
  
  
== Beschreibung ==  
+
== Beschreibung ==
Der Alphatest verwirft [[Fragment|Fragmente]] je nach dem Ausgang des Vergleiches zwischen dem Alphawert des einkommenden Fragmentes und einem konstanten Referenzwert. Mittels '''glAlphaFunc''' kann man die für diesen Test benötigte Vergleichsfunktion und den Referenzwert festlegen. Der Vergleich wird nur dann aufgeführt wenn der Alphatest aktiviert (Vorgabe ist Deaktiviert) ist ([[glEnable]] bzw. [[glDisable]] mit dem Token '''GL_ALPHA_TEST''').
+
Der Alphatest verwirft [[Fragment|Fragmente]] je nach dem Ausgang des Vergleiches zwischen dem Alphawert des einkommenden Fragmentes und einem konstanten Referenzwert. Mittels '''glAlphaFunc''' kann man die für diesen Test benötigte Vergleichsfunktion und den Referenzwert festlegen. Der Vergleich wird nur dann ausgeführt, wenn der Alphatest aktiviert (Vorgabe ist deaktiviert) ist ([[glEnable]] bzw. [[glDisable]] mit dem Token '''GL_ALPHA_TEST''').
  
Die beiden Parameter legen die Bedingung fest die erfüllt werden muss damit der eingehende Pixel auch gerendert wird. Der ankommende Alphawert wird dabei mit ''ref'' anhand der via ''func'' übergebenen Funktion getestet. Sollte dieser den Test bestehen, wird das Fragment gerendert (sofern es auch die nachkommenden Stencil- und Tiefentests besteht). Sollte der Test nicht bestanden werden, so wird an der Fragmentposition keine Änderung des Framebuffers vorgenommen.  
+
Es sei an dieser Stelle darauf hingewiesen, dass der Alphatest, im Gegensatz zum [[Blending]], die Fragmente tatsächlich verwirft. Beim Blending werden auch komplett durchsichtige Fragmente weiter durch die Pipeline geschleust. Der Alphatest kann damit entscheidend die Last für Fragmentoperationen (z.B. Fragmentshader) verringern.
  
Erlaubte Vergleichsfunktionen :
+
Die beiden Parameter legen die Bedingung fest, die erfüllt werden muss, damit der eingehende Pixel auch gerendert wird. Der ankommende Alphawert wird dabei mit ''ref'' anhand der via ''func'' übergebenen Funktion getestet. Sollte dieser den Test bestehen, wird das Fragment gerendert (sofern es auch die nachkommenden Stencil- und Tiefentests besteht). Sollte der Test nicht bestanden werden, so wird an der Fragmentposition keine Änderung des Framebuffers vorgenommen.
 +
 
 +
Erlaubte Vergleichsfunktionen:
  
 
;GL_NEVER : Niemals erfolgreich.
 
;GL_NEVER : Niemals erfolgreich.
Zeile 50: Zeile 49:
 
;GL_ALWAYS : Immer erfolgreich (Vorgabe).
 
;GL_ALWAYS : Immer erfolgreich (Vorgabe).
  
'''glAlphaFunc''' arbeitet auf alle pixelschreibenden Funktionen, also auch Pixel die mit Zeichen- oder Kopierfunktionen gerendert wurden, Umwandlungen von Punkten, Linien, Polygonen und Bitmaps. Löschbefehle werden jedoch nicht beeinflusst.
+
'''glAlphaFunc''' arbeitet auf alle pixelschreibenden Funktionen, also auch Pixel, die mit Zeichen- oder Kopierfunktionen gerendert wurden, Umwandlungen von Punkten, Linien, Polygonen und Bitmaps. Löschbefehle werden jedoch nicht beeinflusst.
 +
 
 +
 
  
 +
==Beispiel==
 +
Drei identisch große texturierte Quadrate wurden gerendert. Zwischen den Quadraten wurde nur der Tiefentest verändert. Die Textur war komplett schwarz. Allerdings war sie in 3 Zonen mit unterschiedlichem Alphawert (1.0, 0.66, 0.33) unterteilt.
 +
Man sieht, dass die Quadrate dadurch unterschiedlich groß im Framebuffer ankommen.
 +
 +
Durch die Verwendung von '''GL_GREATER''' werden nur die Fragmente gezeichnet, die einen größeren Alphawert aufweisen als der Vergleichswert:
 +
 +
{|
 +
|<source lang="pascal">
 +
  glEnable(GL_ALPHA_TEST);
 +
  texture.Bind;
 +
  glAlphaFunc(GL_GREATER, 0.1);
 +
  glBegin(GL_QUADS);
 +
    glTexCoord2f(0,1); glVertex3f(-5,-1,0);
 +
    glTexCoord2f(0,0); glVertex3f(-3,-1,0);
 +
    glTexCoord2f(1,0); glVertex3f(-3, 1,0);
 +
    glTexCoord2f(1,1); glVertex3f(-5, 1,0);
 +
  glEnd;
 +
  glAlphaFunc(GL_GREATER, 0.4);
 +
  glBegin(GL_QUADS);
 +
    glTexCoord2f(0,1); glVertex3f(-2,-1,0);
 +
    glTexCoord2f(0,0); glVertex3f(-0,-1,0);
 +
    glTexCoord2f(1,0); glVertex3f(-0, 1,0);
 +
    glTexCoord2f(1,1); glVertex3f(-2, 1,0);
 +
  glEnd;
 +
  glAlphaFunc(GL_GREATER, 0.7);
 +
  glBegin(GL_QUADS);
 +
    glTexCoord2f(0,1); glVertex3f( 1,-1,0);
 +
    glTexCoord2f(0,0); glVertex3f( 3,-1,0);
 +
    glTexCoord2f(1,0); glVertex3f( 3, 1,0);
 +
    glTexCoord2f(1,1); glVertex3f( 1, 1,0);
 +
  glEnd;</source>
 +
|[[Bild:Alphatest_Tex.png|framed|center|Die Textur mit dem dreigeteilten Alphakanal.]]
 +
[[Bild:AlphaTest_Ergebnis.jpg|framed|center|Das Resultat des links stehenden Codes.]]
 +
|}
  
  
Zeile 61: Zeile 96:
  
 
== Fehlermeldungen ==
 
== Fehlermeldungen ==
'''GL_INVALID_ENUM''' wird generiert wenn ''func'' kein gültiger Wert ist.
+
'''GL_INVALID_ENUM''' wird generiert, wenn ''func'' kein gültiger Wert ist.
  
'''GL_INVALID_OPERATION''' wird generiert wenn '''glAlphaFunc''' zwischen einem [[glBegin]] und dem passenden [[glEnd]] aufgerufen wird.
+
'''GL_INVALID_OPERATION''' wird generiert, wenn '''glAlphaFunc''' zwischen einem [[glBegin]] und dem passenden [[glEnd]] aufgerufen wird.
  
  
  
 
==  Zugehörige Wertrückgaben ==
 
==  Zugehörige Wertrückgaben ==
[[glGet]] mit dem Token '''GL_ALPHA_TEST_FUNC'''<br>
+
[[glGet]] mit dem Token [[glGet#GL_ALPHA_TEST_FUNC|GL_ALPHA_TEST_FUNC]]
[[glGet]] mit dem Token '''GL_ALPHA_TEST_REF'''<br>
+
 
[[glIsEnabled]] mit dem Token '''GL_ALPHA_TEST'''<br>
+
[[glGet]] mit dem Token [[glGet#GL_ALPHA_TEST_REF|GL_ALPHA_TEST_REF]]
 +
 
 +
[[glIsEnabled]] mit dem Token [[glGet#GL_ALPHA_TEST|GL_ALPHA_TEST]]
  
  
Zeile 78: Zeile 115:
  
 
[[Kategorie:GL|AlphaFunc]]
 
[[Kategorie:GL|AlphaFunc]]
 +
[[Kategorie:GL1.0|AlphaFunc]]

Aktuelle Version vom 10. März 2009, 19:17 Uhr

glAlphaFunc

Name

glAlphaFunc - Legt die Funktion für den Alphatest fest.


Delphi-Spezifikation

procedure glAlphaFunc(func : TGLenum; ref : TGLclampf);


Parameter

func Legt den Alpha-Vergleich für die Funktion fest. Gültig sind hier die Konstanten GL_NEVER, GL_LESS, GL_EQUAL, GL_LEQUAL, GL_GREATER, GL_NOTEQUAL, GL_GEQUAL, und GL_ALWAYS (Vorgabe).
ref Gibt an mit welchem Referenzwert die ankommenden Alphawerte verglichen werden. Dieser Wert wird in die Reichweite 0 bis 1 angepasst, wobei 0 (Vorgabe) für den niedrigsten möglichen Alphawert steht und 1 für den höchsten.


Beschreibung

Der Alphatest verwirft Fragmente je nach dem Ausgang des Vergleiches zwischen dem Alphawert des einkommenden Fragmentes und einem konstanten Referenzwert. Mittels glAlphaFunc kann man die für diesen Test benötigte Vergleichsfunktion und den Referenzwert festlegen. Der Vergleich wird nur dann ausgeführt, wenn der Alphatest aktiviert (Vorgabe ist deaktiviert) ist (glEnable bzw. glDisable mit dem Token GL_ALPHA_TEST).

Es sei an dieser Stelle darauf hingewiesen, dass der Alphatest, im Gegensatz zum Blending, die Fragmente tatsächlich verwirft. Beim Blending werden auch komplett durchsichtige Fragmente weiter durch die Pipeline geschleust. Der Alphatest kann damit entscheidend die Last für Fragmentoperationen (z.B. Fragmentshader) verringern.

Die beiden Parameter legen die Bedingung fest, die erfüllt werden muss, damit der eingehende Pixel auch gerendert wird. Der ankommende Alphawert wird dabei mit ref anhand der via func übergebenen Funktion getestet. Sollte dieser den Test bestehen, wird das Fragment gerendert (sofern es auch die nachkommenden Stencil- und Tiefentests besteht). Sollte der Test nicht bestanden werden, so wird an der Fragmentposition keine Änderung des Framebuffers vorgenommen.

Erlaubte Vergleichsfunktionen:

GL_NEVER 
Niemals erfolgreich.
GL_LESS 
Erfolgreich wenn der ankommende Alphawert kleiner' als der Referenzwert ist.
GL_EQUAL 
Erfolgreich wenn der ankommende Alphawert gleich' dem Referenzwert ist.
GL_LEQUAL 
Erfolgreich wenn der ankommende Alphawert kleiner oder gleich' dem Referenzwert ist.
GL_GREATER 
Erfolgreich wenn der ankommende Alphawert größer' als der Referenzwert ist.
GL_NOTEQUAL 
Erfolgreich wenn der ankommende Alphawert ungleich' dem Referenzwert ist.
GL_GEQUAL 
Erfolgreich wenn der ankommende Alphawert größer oder gleich' dem Referenzwert ist.
GL_ALWAYS 
Immer erfolgreich (Vorgabe).

glAlphaFunc arbeitet auf alle pixelschreibenden Funktionen, also auch Pixel, die mit Zeichen- oder Kopierfunktionen gerendert wurden, Umwandlungen von Punkten, Linien, Polygonen und Bitmaps. Löschbefehle werden jedoch nicht beeinflusst.


Beispiel

Drei identisch große texturierte Quadrate wurden gerendert. Zwischen den Quadraten wurde nur der Tiefentest verändert. Die Textur war komplett schwarz. Allerdings war sie in 3 Zonen mit unterschiedlichem Alphawert (1.0, 0.66, 0.33) unterteilt. Man sieht, dass die Quadrate dadurch unterschiedlich groß im Framebuffer ankommen.

Durch die Verwendung von GL_GREATER werden nur die Fragmente gezeichnet, die einen größeren Alphawert aufweisen als der Vergleichswert:

  glEnable(GL_ALPHA_TEST);
  texture.Bind;
  glAlphaFunc(GL_GREATER, 0.1);
  glBegin(GL_QUADS);
    glTexCoord2f(0,1); glVertex3f(-5,-1,0);
    glTexCoord2f(0,0); glVertex3f(-3,-1,0);
    glTexCoord2f(1,0); glVertex3f(-3, 1,0);
    glTexCoord2f(1,1); glVertex3f(-5, 1,0);
  glEnd;
  glAlphaFunc(GL_GREATER, 0.4);
  glBegin(GL_QUADS);
    glTexCoord2f(0,1); glVertex3f(-2,-1,0);
    glTexCoord2f(0,0); glVertex3f(-0,-1,0);
    glTexCoord2f(1,0); glVertex3f(-0, 1,0);
    glTexCoord2f(1,1); glVertex3f(-2, 1,0);
  glEnd;
  glAlphaFunc(GL_GREATER, 0.7);
  glBegin(GL_QUADS);
    glTexCoord2f(0,1); glVertex3f( 1,-1,0);
    glTexCoord2f(0,0); glVertex3f( 3,-1,0);
    glTexCoord2f(1,0); glVertex3f( 3, 1,0);
    glTexCoord2f(1,1); glVertex3f( 1, 1,0);
  glEnd;
Die Textur mit dem dreigeteilten Alphakanal.
Das Resultat des links stehenden Codes.


Hinweise

Alphatests werden nur im RGBA-Modus durchgeführt.


Fehlermeldungen

GL_INVALID_ENUM wird generiert, wenn func kein gültiger Wert ist.

GL_INVALID_OPERATION wird generiert, wenn glAlphaFunc zwischen einem glBegin und dem passenden glEnd aufgerufen wird.


Zugehörige Wertrückgaben

glGet mit dem Token GL_ALPHA_TEST_FUNC

glGet mit dem Token GL_ALPHA_TEST_REF

glIsEnabled mit dem Token GL_ALPHA_TEST


Siehe auch

glBlendFunc, glClear, glDepthFunc, glEnable, glStencilFunc