Anti-Aliasing in OpenGL

8

Ich habe gerade mit OpenGL-Programmierung begonnen und ich baue eine Clock-Anwendung. Ich möchte, dass es so einfach aussieht: Ссылка

Meine Anwendung sieht jedoch sehr "un-anti-aliased" aus: Ссылка

Ich habe die GL_SMOOTH_POLYGON-Methode ausprobiert, die im Red Book erwähnt wird. Das scheint jedoch nichts zu tun.

Ich arbeite an einem Laptop mit integrierter Grafik von Intel. Die Karte unterstützt nicht Dinge wie GL_ARB_multisample.

Was sind meine Möglichkeiten an dieser Stelle meiner App anti-aliased?

    
hojusaram 06.11.2010, 05:48
quelle

2 Antworten

27

Intel integrierte Videokarten sind berüchtigt für ihre fehlende Unterstützung für OpenGL-Antialiasing. Sie können das aber umgehen.

Erste Option: Manuelles Supersampling
Mache eine Textur, die 2x mal so groß ist wie der Bildschirm. Rendern Sie Ihre Szene über FBO in die Textur und rendern Sie die Textur dann mit halber Interpolationsbreite in halber Größe. Kann sehr langsam sein (in komplexen Szenen) aufgrund der 4x Vergrößerung der zu zeichnenden Pixel.

führt zu schwachem Antialiasing (daher empfehle ich es nicht für Desktop-Software wie Ihre Uhr). Überzeugen Sie sich selbst:

Zweite Option: (erweitert)
Verwenden Sie einen Shader, um Morphologisches Antialiasing auszuführen. Dies ist eine neue Technik und ich weiß nicht, wie einfach es zu implementieren ist. Es wird von einigen fortgeschrittenen Spielen verwendet.

Dritte Option:
Verwenden Sie Texturen und bilineare Interpolation zu Ihrem Vorteil, indem Sie OpenGL-Primitive über Texturen emulieren. Die Technik wird hier beschrieben.

Vierte Option: Verwenden Sie für jedes Element Ihrer Uhr eine separate Textur.

Verwenden Sie zum Beispiel für Ihren Stundenpfeil kein flaches, schwarzes GL_POLYGON in der Form Ihres Pfeils. Verwenden Sie stattdessen einen gedrehten GL_QUAD, der mit einem in einem Bildprogramm gezeichneten Stundenpfeilbild strukturiert ist. Die bilineare Interpolation sorgt dann für Antialiasing, wenn Sie es drehen.

Diese Option würde die geringste Anstrengung erfordern und sieht sehr gut aus.

Fünfte Option:
Verwenden Sie eine Bibliothek, die Software-Rendering unterstützt -

  • Qt
  • Kairo
  • Windows GDI +
  • WPF
  • XRender
  • usw.

Solche Bibliotheken enthalten ihre eigenen Algorithmen für das Antialiasing-Rendering, so dass sie für das Antialiasing nicht von Ihrer Grafikkarte abhängig sind. Die Vorteile sind:

  • Wird auf jeder Plattform gleich dargestellt. (Dies ist in verschiedenen Fällen nicht mit OpenGL garantiert - zum Beispiel werden die dicken diagonalen "Tick" -Zeilen in Ihrem Screenshot als Parallelogramme und nicht als Rechtecke dargestellt)
  • Hat eine große Menge an praktischen Zeichnungsfunktionen ("drawArc", "drawText", "drawConcavePolygon", und diese werden Farbverläufe und Ränder unterstützen. Außerdem erhalten Sie Dinge wie eine Image-Klasse.)
  • Einige, wie zB Qt, werden wesentlich mehr Funktionen vom Desktop-App-Typ bieten. Dies kann sogar für eine Uhr-App sehr nützlich sein. Beispielsweise:
    • in einer OpenGL-Anwendung würden Sie wahrscheinlich alle 20 ms eine Schleife erstellen und die Uhr erneut rendern, und nicht einmal zweimal überlegen. Dies würde unnötige CPU-Zyklen verschlingen und die CPU auf einem Laptop aufwecken, wodurch die Batterie erschöpft wird. Im Gegensatz dazu ist Qt sehr intelligent, wenn es Teile Ihrer Uhr neu zeichnen muss (z. B. wenn die rechte Hälfte der Uhr nicht mehr von einem Fenster verdeckt wird oder wenn Ihre Uhr den Minutenpfeil um einen Schritt bewegt).
    • sobald du zum Implementieren kommst, z.B. Ein Tray-Icon oder ein Einstellungsdialog für Ihre Uhr, eine Bibliothek wie Qt macht es zum Kinderspiel. Es ist schön, die gleiche Bibliothek für alles zu verwenden.

Der Nachteil ist eine viel schlechtere Leistung, aber das ist für eine Clock-App überhaupt nicht von Belang, und sie dreht sich um, wenn man die von mir erwähnte Intelligent-Redrawing-Funktionalität berücksichtigt.

Für so etwas wie eine Uhr-App wird die fünfte Option sehr empfohlen. OpenGL ist hauptsächlich nützlich für Spiele, 3D-Software und intensive grafische Inhalte wie Musik-Visualisierer. Für Desktop-Apps ist es zu niedrig und die Implementierungen unterscheiden sich zu sehr.

    
Stefan Monov 06.11.2010, 06:37
quelle
0

Zeichnen Sie es in ein Framebuffer-Objekt mit zwei (oder mehr) der endgültigen Auflösung und verwenden Sie dieses Bild dann als Textur für ein einzelnes Quad, das im aktuellen Fenster gezeichnet wird.

    
Ben Jackson 06.11.2010 06:20
quelle

Tags und Links