TUD Logo

TUD Startseite » ... » Ergebnisse studentischer Arbeiten » Große Belege » Patrick Brausewetter

Computergraphik

GPU Shader für geometrische Grundprimitive

Thema der Beleg/Diplomarbeit

Lehrstuhl für Computergraphik und Visualisierung


Student: Patrick Brauswetter
Betreuer: Stefan Gumhold
Verantwortlicher Hochschullehrer: Stefan Gumhold

Motivation

In verschiedenen Visualisierungsanwendungen werden physikalische Größen mit Hilfe sehr vieler Grundprimitive visuell dargestellt. Bei der Vektorfeldvisualisierung werden z.B. sehr viele Kugeln entlang von Bahnlinien geführt. In der Molekülvisualisierung werden die einzelnen Atome von Molekülkomplexen in unterschiedlichen Farben dargestellt. Ziel dieser Belegarbeit war die Entwicklung eines auf OpenGL aufbauenden Frameworks in der Programmiersprache C++ zur Darstellung von geometrischen Grundprimitiven (Kugel, Zylinder und Kegel). Um die Tesselierung zu umgehen, sollten GLSL-Shadern genutzt werden. Wesentliches Merkmal war eine Optimierung auf Geschwindigkeit. Außerdem sollte ein Vergleich mit einer Implementierung, die auf einer Tesselierung der Grundprimitive beruht, stattfinden.

Beschreibung

Um die Tesselierung zu umgehen, wurde ein lokales Raytracing eingesetzt, bei dem jedes Primitiv extra behandelt wird. Die nötigen Schritte zum Zeichnen eines Objektes sind:

  • Ermittlung der Silhouette des Objektes (im Vertex Shader)
  • nach der Rasterisierung der Silhouette für jeden entstandenen Pixel einen Strahl-Primitiv-Schnitt durchführen, um die reelle Tiefe und die Normale des Pixels zu bestimmen (im Fragment Shader)
  • Speicherung der Koordinate und Normale zusammen mit dem diffusen Materialanteil in 2 Texturen (im Fragment Shader)
  • im verzögerten Shader für jedes Pixel des Monitors eine Phong-Lichtberechnung durchführen (im Fragment Shader in einer 2. Phase nachdem alle Primitive berechnet wurden)

Ergebnisse

Grundlage dieses Belegs ist die Arbeit von Stefan Gumhold (Splatting Illuminated Ellipsoids with Depth Correction). Die dort vorgestellte inkrementelle Methode zum Zeichnen einer Kugel wurde übernommen und dann in abgewandelter Form auf den Zylinder angewandt. Für den Kegel musste eine komplizierte Fallunterscheidung zur Bestimmung der Silhouette entwickelt werden und die inkrementelle Schnittberechnung konnte hier nicht genutzt werden.
Zur Beleuchtung wurde die OpenGL-Beleuchtungsberechnung nachempfunden, was allerdings einige Probleme mit sich bringt, nicht zuletzt wegen dem Ansatz der verzögerten Beleuchtung.
Die Shader wurden in ein einfaches Framework eingebunden, dass mit verschiedenen GUI-Toolkits benutzt werden kann. Es bietet ein einfaches Szenen-Konzept an.

Screenshot Kugel Shader
Testszene Kugel-Shader mit Silhouetten
Screenshot Zylinder Shader (Fall 1)
Testszene Zylinder-Shader mit Silhouette (Fall 1, von oben)
Screenshot Zylinder Shader (Fall 2)
Testszene Zylinder-Shader mit Silhouetten (Fall 2, von Seite)
Screenshot Kegel Shader (Fall 1)
Testszene Kegel-Shader mit Silhouetten (Fall 1, von oben)
Screenshot Kegel Shader (Fall 2)
Testszene Kegel-Shader mit Silhouetten (Fall 2, von schräg oben)
Screenshot Kegel Shader (Fall 3)
Testszene Kegel-Shader mit Silhouette (Fall 3, von seite)

Ausblick

Als Erweiterung können noch weitere Primtive hinzugefügt werden (z.B. Torus). Dafür ist auch ein Mechanismus in das Framework eingebaut, sodass man ohne Änderungen an diesem neue Primitivtypen ergänzen kann.
Darüber hinaus ist die Integration in OpenGL noch unvollständig:

  • Texturierung der Objekte fehlt, wobei dabei das Hauptproblem die Performanz ist, denn bei den bisherigen Primitiven würde man auf direktem Wege sinus- und cosinus-Operationen nutzen
  • 'Backface culling' wird gar nicht unterstützt
  • 'User clipping' wird nur unvollständig unterstützt
  • Nebel fehlt gänzlich

Die Technik des verzögerten Beleuchtens könnte noch verbessert werden, sodass man sie für (fast beliebige) andere OpenGL-Programme einsetzen kann. Außerdem könnte man noch erweiterte Effekte wie Schatten einbauen.

Download

Stand: 1.2.2010, 14:38 Uhr
Autor: Corina Weissbach