OpenGL Smooth

Aus DGL Wiki
Version vom 21. Mai 2006, 07:25 Uhr von Lyr (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

OpenGL besitzt eine weitere Möglichkeit Kanten-Antialiasing zu realisieren. Diese können mit glEnable mit den Parametern GL_POINT_SMOOTH, GL_LINE_SMOOTH bzw. GL_POLYGON_SMOOTH aktiviert werden.

Technik

Wenn der Smooth-Wert für ein Primitive aktiviert ist, so werden im Fall von Punkten und Linien bereits andere Pixel vom Rasterizer generiert. Zusätzlich wird für jedes generierte Fragment noch ein Deckungs-Wert berechnet, welcher angibt wie viel Prozent des Fragmentes von dem entsprechenden Primitive bedeckt werden.

Dieser Deckungs-Wert wird nach allen anderen Berechnungen mit dem Alpha-Wert des Fragmentes multipliziert. Aus diesem Grund hängt diese Art von Antialiasing auch mit Blending zusammen, wodurch das Zeichnen üblicherweise mit Tiefensortierung erfolgen muss (was gleichzeitig der größte Nachteil an dieser Methode ist).

Punkte

Werden (größere) Punkte mit aktiviertem GL_POINT_SMOOTH gerendert, so wird offensichtlich aus dem Quadrat ein richtiger Kreis. Auch ohne aktiviertem Blending (mittels glEnable( GL_BLEND ) ) hätte man hier also bereits ein Kreisform, aber natürlich ohne geglätteten Rand.

GL POINT SMOOTH deaktiviert.png GL POINT SMOOTH aktiviert.png

4-Fach vergrößterter Punkt links ohne und recht mit GL_POINT_SMOOTH.

Linien

Werden Linien mit aktiviertem GL_LINE_SMOOTH gerendert, so wird offensichtlich aus dem Trapez (mehrere 1-Pixel Linien entweder nebeneinander oder übereinander) ein Quader. Dies hat (vor allem bei breiteren Linien) ebenfalls auch Auswirkungen wenn Blending deaktiviert ist.

GL LINE SMOOTH deaktiviert.png GL LINE SMOOTH aktiviert.png

4-Fach vergrößterte Linie links ohne und recht mit GL_LINE_SMOOTH.

Polygone

Polygone (also Triangles, Quads, Triangle-Strips, Triangle-Fans und Polygone) verändern ihr Erscheinungsbild mit deaktivierten Blending kaum. Mit aktiviertem Blending werden aber natürlich die Kanten geglättet.

Probleme

Bei Polygonen tauchen die größten Problem auf, und zwar so große, dass es von vielen Grafikkarten gar nicht unterstützt wird. Vor allem bei aktiviertem GL_POLYGON_SMOOTH kommt es also des öfteren vor, dass in den Softwaremodus umgeschalten wird, und nicht einmal dann kann man sicher sein dass es funktioniert. Und wenn es doch funktioniert so erwartet einem häufig bereits die nächste Überraschung.

Das Problem ist, dass zwei aneinanderliegende Dreiecke häufig einen Spalt aufweisen. Da die Primitiven GL_QUADS, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN und GL_POLYGON üblicherweise ebenfalls in Dreiecke aufgeteilt werden, entsteht dieser Spalt auch dort. Und wäre dies nicht schon genug so kann ein einzelnes Dreieck an einer Clipping Plane oder dem Frustum ebenfalls noch in 4 kleiner Dreiecke aufgesplittet werden, wo wir wiederum diesen Spalt antreffen.

Also GL_POLYGON_SMOOTH ist mit äusserster Vorsicht zu geniesen.

OpenGL Funktionen

  • glEnable um GL_POINT_SMOOTH, GL_LINE_SMOOTH bzw. GL_POLYGON_SMOOTH zu aktivieren.
  • glHint um den OpenGL-Treiber zu bitten eine schnellere oder eine schönere Berechnungsmethode zu verwenden.