User Tools

Site Tools


representation_of_the_data_on_gpu

This is an old revision of the document!


Repräsentation der Daten auf der GPU

Einleitender Hinweis: Die GUI verwendet QML für die grafischen Benutzerelemente (Slider, Buttons, usw.). Die eigentliche Visualisierung wird mit zwei Technologien realisiert. Für den radialen Icicle Plot (Darstellung des Baumes mit Ringsegmenten) wird die QPainter API von Qt benutzt, da insbesondere die Darstellung von Text mit OpenGL nicht trivial ist. Für die Darstellung der Kurven (Größenordnung 10.000 Kurven pro Frame) ist QPainter nicht performant genug (ca. 5 sek pro Frame, also 0.2 FPS) für eine interaktive Visualisierung (> 10 FPS). Hierfür verwenden wir OpenGL ES 2.0, um mit einigen Optimierungen mehr als 20 FPS für den gleichen Datensatz zu erreichen.


Vertex Buffer

Die Festlegung auf OpenGL ES 2.0 verhindert die Benutzung von Geometry Shadern, daher wird bei Programmstart ein großer Triangle Strip erzeugt, der die Vertices für die höchst mögliche Anzahl an Kurven für einen Datensatz bereit hält und im Vertex Buffer abgelegt wird.

Fig: Layout einer Kurve als Triangle Strip im Vertex Buffer.

Damit ein Draw-Aufruf für alle Kurven genügt, werden die Kurven an den Enden mit degenerierten Dreiecken verbunden, also mit Dreiecken, die eine Fläche = 0 haben und daher nicht angezeigt werden. Dafür bekommen die ersten beiden Punkte P0 und P1 jeder Kurve die gleiche Koordinate zugewiesen, wie auch die letzten beiden Punkte Pn und Pn−1 auf den gleiche Koordinate fallen (Für die Lesbarkeit nicht im Bild dargestellt). Als Triangle Strip entstehen dann zwei unendlich dünne Dreicke zwischen Kurven die hintereinander im Vertex Buffer gespeichert sind.

Als Attribut bekommt jeder Vertex im Vertex Buffer einen Wert für side der entweder 1 oder -1 sein kann. Außerdem hat jeder Vertex ein Attribut tex_pos eine Texturkoordinate für die Textur tex_1 Gegen¨uberliegende Punkte einer Kurve haben den gleichen Wert für tex_pos und unterscheiden sich nur im Wert für side.

Fig: Verbindungen zwischen den geladenen Texturen und dem Vertex Buffer.


tex_1

Für jedes Jahr wird an den Namen tex_1 eine andere Textur gebunden. An der Texturkoordinate tex_pos ist die Positionen des aktuellen Kurvenpunkte nach der Bezier Interpolation gespeichert sowie der Interpolationsparameter t. t wird z.B. zur Farbinterpolation der Kurve verwendet (von Export t = 0 nach Import t = 1). Die Pixel einer Kurve mit den Werten jedes Kurvenpunktes sind nebeneinander gruppiert. Am Anfang einer Solchen Gruppe liegt ein weiterer Pixel, der Daten zur ganzen Kurve kodiert. Mit Hilfe von t kann die Position dieses Pixels berechnet werden. Er enthält IDs für den Start- und Endknoten jeder Kurve, die als Koordinate für tex_selection genutzt werden können und eine weitere Texturkoordinate tex_pos für den Zugriff auf tex_2

tex_selection

tex_selection speichert für jede Knoten-ID einen Wert von 0 für unausgewählt bis 1 für selektiert.

tex_2

Unter tex_2 wird für jedes Jahr und jede ausgewählte Produktkategorie eine andere Textur geladen. Sie enthält mit conn value die Breite einer Verbindung/Kurve (für den Einheitskreis skaliert) und mit conn_angle_dist den Winkelabstand zwischen den Endpunkten einer Kurve.

representation_of_the_data_on_gpu.1512287475.txt.gz · Last modified: 2017/12/03 08:51 by 178.91.253.70