Blenden: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Link zum tutorial gefixt)
K (Der Ausdruck ''<pascal>(.*?)</pascal>'' wurde ersetzt mit ''<source lang="pascal">$1</source>''.)
Zeile 26: Zeile 26:
  
 
Eine Lösung des Problems die auf mehrmaligem Zeichnen der Objekte beruht sieht so aus:
 
Eine Lösung des Problems die auf mehrmaligem Zeichnen der Objekte beruht sieht so aus:
<pascal>
+
<source lang="pascal">
 
   backGround.alpha:= 0;
 
   backGround.alpha:= 0;
 
   setBackground(backGround);
 
   setBackground(backGround);
Zeile 74: Zeile 74:
 
       inc(i);  
 
       inc(i);  
 
     end;
 
     end;
</pascal>
+
</source>
 
''backGround'' ist eine Struktur die die RGBA-Anteile der Farbe enthält, in ''setbackGround'' wird der Framebuffer mit dieser Farbe überschrieben/gelöscht.
 
''backGround'' ist eine Struktur die die RGBA-Anteile der Farbe enthält, in ''setbackGround'' wird der Framebuffer mit dieser Farbe überschrieben/gelöscht.
  

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

Was ist Blending?

Blending ist die einzige Möglichkeit um transparente 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)