Blenden

Aus DGL Wiki
Version vom 5. Dezember 2013, 21:12 Uhr von Glawesome (Diskussion | Beiträge) (Was ist Blending?: transparent -> teiltransparent (Transparenz geht auch mit Alphamasking))

Wechseln zu: Navigation, Suche

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.
Das beschriebene Problem kann nur umgangen werden, indem man seine Objekte tiefengeordnet rendert.

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 den 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)