Blenden: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Formatierung)
K (Checkliste verlinkt, Zeichensetzung, Layout, kleine Umformulierung)
 
(8 dazwischenliegende Versionen von 6 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
== Was ist Blending? ==
 
== Was ist Blending? ==
Blending ist die einzige Möglichkeit um <b>transparente Objekte</b> darzustellen.
+
Blending ist die einzige Möglichkeit um '''teiltransparente''' (halbdurchsichtige) Objekte darzustellen.
<br>
+
 
 
== Wie funktioniert Blending? ==
 
== 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).  
 
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>
 
<br>
 
== Probleme im Zusammenhang mit Blending ==
 
== 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.
+
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>
 
<br>
 
<br>
Beispiel:
+
'''Beispiel:'''
 
<br>
 
<br>
<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.
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.
 
Dieser Effekt tritt auch auf, wenn sich viele transparente Objekte überlagern.
<br>
+
<br><br>
Das beschriebene Problem kann nur umgangen werden, indem man seine Objekte tiefengeordnet rendert.
+
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).
<br>
+
 
 
== Wie wird Blending verwendet? ==
 
== Wie wird Blending verwendet? ==
 
Blending kann durch den Befehl [[glEnable]]/[[glEnable|glDisable]] und dem Parameter GL_BLEND aktiviert/deaktiviert werden.
 
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.
+
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:
 +
<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)