Blenden: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (z->Z)
K (Checkliste verlinkt, Zeichensetzung, Layout, kleine Umformulierung)
 
(11 dazwischenliegende Versionen von 7 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
== Was ist das? ==
+
== Was ist Blending? ==
 +
Blending ist die einzige Möglichkeit um '''teiltransparente''' (halbdurchsichtige) Objekte darzustellen.
  
Mit Blenden bezeichnet man das kontrollierte mischen von Texturen bzw Farben.
+
== Wie funktioniert Blending? ==
 +
Der Farbwert des resultierenden [[Fragment]]s im [[Framebuffer]] ergibt sich immer aus dem Farbwert des Fragmentes im Framebuffer (Destinationfaktor) und dem Farbwert des zu zeichnenden Fragments (Sourcefaktor).
 +
<br>
 +
== Probleme im Zusammenhang mit Blending ==
 +
Aus der Funktionsweise von Blending lässt sich schließen, dass die Reihenfolge, in der die Objekte gezeichnet werden, beim Blending keinesfalls egal ist.
 +
<br>
 +
<br>
 +
'''Beispiel:'''
 +
<br>
 +
Man blickt durch eine blaue Fensterscheibe auf eine weiße Wand. Der Farbwert, der sich am Ende im Framebuffer befindet, ergibt sich aus dem Blau der Scheibe und dem Weiß der Wand. Wird die Scheibe nach der Wand gezeichnet, befindet sich das Weiß der Wand im Framebuffer und das gewünschte Resultat wird erzielt. Wird das Fenster jedoch zuerst gezeichnet, so befindet sich noch nicht das Weiß der Wand im Framebuffer und das Ergebnis erscheint falsch.
 +
Dieser Effekt tritt auch auf, wenn sich viele transparente Objekte überlagern.
 +
<br><br>
 +
Um solche Probleme zu umgehen, sollte man zuerst alle nicht transparenten Objekte zeichnen. Danach rendert man alle transparenten Objekte nach der Tiefe sortiert (das am weitesten entfernte zuerst).
  
== Wie macht man das? ==
+
== Wie wird Blending verwendet? ==
 +
Blending kann durch den Befehl [[glEnable]]/[[glEnable|glDisable]] und dem Parameter GL_BLEND aktiviert/deaktiviert werden.
 +
Die Operation, mit welcher Source- und Destinationfaktor verknüpft werden sollen, wird durch die Funktion [[glBlendFunc]] bestimmt.
  
OpenGL besitzt speziell für das Blenden einen Zustand der mittels [[glEnable]] aktiviert werden kann. Anschließend hat man die Möglichkeit über [[glBlendFunc]] festzulegen, wie geblendet werden soll.
+
== Korrektes Blending bei sich überlappenden Polygonen ==
 +
Ein ziemlich verzwicktes Problem ist es, wenn sich transparente Objekte überlappen. Es ist nicht möglich, diese Situation durch einmaliges Zeichnen zu behandeln (Es sei denn man kann die Polygone in sich nicht überlappende Teile zerlegen. Dies ist aber eher eine akademische Lösung, und in der Praxis nicht umsetzbar.).
 +
 
 +
Eine Lösung des Problems, die auf mehrmaligem Zeichnen der Objekte beruht, sieht so aus:
 +
<source lang="pascal">
 +
  backGround.alpha:= 0;
 +
  setBackground(backGround);
 +
 
 +
  //transparente Objekte
 +
  glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
 +
  glEnable(GL_BLEND);
 +
  i:= 0;
 +
  while (i <> m_transpObjects.count) do
 +
    begin
 +
      glDepthFunc(GL_GREATER);
 +
      glDepthMask(GL_FALSE);
 +
      //
 +
      Zeichne Objekt i
 +
      //
 +
      glDepthFunc(GL_LEQUAL);
 +
      glDepthMask(GL_TRUE);
 +
      //
 +
      Zeichne Objekt i
 +
      //
 +
      inc(i);
 +
    end;
 +
 
 +
  //solide Objekte 1. Schleife
 +
  i:= 0;
 +
  glDepthFunc(GL_GREATER);
 +
  glDepthMask(GL_FALSE);
 +
  glBlendFunc(GL_ONE_MINUS_DST_ALPHA,GL_DST_ALPHA);
 +
  while (i <> m_solidObjects.count) do
 +
    begin       
 +
      //
 +
      Zeichne Objekt i
 +
      //
 +
      inc(i);
 +
    end;
 +
 
 +
  //solide Objekte 2. Schleife
 +
  i:= 0;
 +
  glDisable(GL_BLEND);
 +
  glDepthFunc(GL_LEQUAL);
 +
  glDepthMask(GL_True);
 +
  while (i <> m_solidObjects.count) do
 +
    begin
 +
      //
 +
      Zeichne Objekt i
 +
      //
 +
      inc(i);
 +
    end;
 +
</source>
 +
''backGround'' ist eine Struktur, die die RGBA-Anteile der Farbe enthält, in ''setbackGround'' wird der Framebuffer mit dieser Farbe überschrieben/gelöscht.
  
 
== Weiterführende Links ==
 
== Weiterführende Links ==
 +
[[Tutorial Lektion 7]] (Blending)<br>
 +
[[Checkliste Blending]] (falls es nicht funktioniert, wie es soll)
  
[http://www.delphigl.com/script/do_show.php?name=lesson7&action=2 Blending Tutorial von DelphiGL.com]
+
[[Kategorie:Anleitung]] [[Kategorie:Technik_oder_Algorithmus]]

Aktuelle Version vom 7. Februar 2014, 15:51 Uhr

Was ist Blending?

Blending ist die einzige Möglichkeit um teiltransparente (halbdurchsichtige) Objekte darzustellen.

Wie funktioniert Blending?

Der Farbwert des resultierenden Fragments im Framebuffer ergibt sich immer aus dem Farbwert des Fragmentes im Framebuffer (Destinationfaktor) und dem Farbwert des zu zeichnenden Fragments (Sourcefaktor).

Probleme im Zusammenhang mit Blending

Aus der Funktionsweise von Blending lässt sich schließen, dass die Reihenfolge, in der die Objekte gezeichnet werden, beim Blending keinesfalls egal ist.

Beispiel:
Man blickt durch eine blaue Fensterscheibe auf eine weiße Wand. Der Farbwert, der sich am Ende im Framebuffer befindet, ergibt sich aus dem Blau der Scheibe und dem Weiß der Wand. Wird die Scheibe nach der Wand gezeichnet, befindet sich das Weiß der Wand im Framebuffer und das gewünschte Resultat wird erzielt. Wird das Fenster jedoch zuerst gezeichnet, so befindet sich noch nicht das Weiß der Wand im Framebuffer und das Ergebnis erscheint falsch. Dieser Effekt tritt auch auf, wenn sich viele transparente Objekte überlagern.

Um solche Probleme zu umgehen, sollte man zuerst alle nicht transparenten Objekte zeichnen. Danach rendert man alle transparenten Objekte nach der Tiefe sortiert (das am weitesten entfernte zuerst).

Wie wird Blending verwendet?

Blending kann durch den Befehl glEnable/glDisable und dem Parameter GL_BLEND aktiviert/deaktiviert werden. Die Operation, mit welcher Source- und Destinationfaktor verknüpft werden sollen, wird durch die Funktion glBlendFunc bestimmt.

Korrektes Blending bei sich überlappenden Polygonen

Ein ziemlich verzwicktes Problem ist es, wenn sich transparente Objekte überlappen. Es ist nicht möglich, diese Situation durch einmaliges Zeichnen zu behandeln (Es sei denn man kann die Polygone in sich nicht überlappende Teile zerlegen. Dies ist aber eher eine akademische Lösung, und in der Praxis nicht umsetzbar.).

Eine Lösung des Problems, die auf mehrmaligem Zeichnen der Objekte beruht, sieht so aus:

   backGround.alpha:= 0;
   setBackground(backGround);

   //transparente Objekte 
  glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 
  glEnable(GL_BLEND);
  i:= 0; 
  while (i <> m_transpObjects.count) do 
    begin 
       glDepthFunc(GL_GREATER); 
       glDepthMask(GL_FALSE); 
       // 
       Zeichne Objekt i 
       // 
       glDepthFunc(GL_LEQUAL); 
       glDepthMask(GL_TRUE); 
       // 
       Zeichne Objekt i 
       // 
       inc(i); 
    end; 
  
  //solide Objekte 1. Schleife
  i:= 0;
  glDepthFunc(GL_GREATER); 
  glDepthMask(GL_FALSE); 
  glBlendFunc(GL_ONE_MINUS_DST_ALPHA,GL_DST_ALPHA); 
  while (i <> m_solidObjects.count) do 
    begin        
       // 
       Zeichne Objekt i 
       // 
       inc(i); 
    end;

  //solide Objekte 2. Schleife
  i:= 0; 
  glDisable(GL_BLEND);
  glDepthFunc(GL_LEQUAL); 
  glDepthMask(GL_True); 
  while (i <> m_solidObjects.count) do 
    begin 
       // 
       Zeichne Objekt i 
       // 
       inc(i); 
    end;

backGround ist eine Struktur, die die RGBA-Anteile der Farbe enthält, in setbackGround wird der Framebuffer mit dieser Farbe überschrieben/gelöscht.

Weiterführende Links

Tutorial Lektion 7 (Blending)
Checkliste Blending (falls es nicht funktioniert, wie es soll)