Beschreibung

Das Framework für die Programmierbeispiele der Visualisierung 1 VU basiert auf dem Volumeshop. Dabei handelt es sich um ein Plugin-basiertes Framework für die schnelle Entwicklung von Visualisierungstechniken basierend auf C++ und Qt welches am Institut entwickelt wurde. Die Programmierbeispiele für die VU sind einzelne Plugins für den Volumeshop. Neben dem Volumeshop inkludiert das gesamte Framework die einzelnen Projekt- und Source-Dateien für die einzelnen Programmieraufgaben sowie ein kleines Tool zum erzeugen der Abgabe. Auf dieser Seite wird das gesamte Framework genauer beschrieben.

Installation

Das Framework wird als Windows Installer ausgeliefert. Es kann hier herunter geladen werden. Nach dem Download kann es einfach an einem beliebigen Ort installiert werden. Nach der Installation sollten im Startmenü folgende Einträge zu sehen sein:

Startmenüeinträge

Der Link Volumeshop startet den Volumeshop im Release Modus mit allen benötigten Einstellungen und Plugins für die Visualisierung 1 Übung. Der Submission Generator startet ein kleines Tool welches zum Erzeugen der Abgabe verwendet werden soll. Der Ordner Exercise enthält drei weitere Ordner für jeden einzelnen Übungsteil. Darin befinden sich Links zu den jeweiligen Visual Studio 2008 Projektdateien.

Volumeshop

Die in der Visualisierung 1 implementierten Teilaufgaben beruhen alle auf dem Volumeshop. Jede einzelne Aufgabe befindet sich in einem eigenen Plugin welches vom Volumeshop geladen wird. Das Visualisierung 1 Framework enthält auch eine Projektdatei für den Volumeshop welche alle benötigen Ansichten, Datensätze und Plugins automatisch lädt. Die folgende Abbildung zeigt das Setup des Volumeshops für die Visualisierung 1 Übung:

Volumeshop

Im linken Bereich der Abbildung sieht man die verschiedenen Rendering Ansichten. Im rechten Bereich sind die Settings zu finden. Sowohl der Viewport als auch die Settings können als eigene Fenster dargestellt werden. Dazu gibt es einen Button im rechten oberen Eck. Um die entkoppelten Fenster wieder zurück an das Hauptfenster zu koppeln genügt es einen Doppelklick in der Menüleiste des entkoppelten Fensters durchzuführen.
Besonders bei kleineren Bildschirmen (Laptop) ist es manchmal notwendig dass man entweder die VisLab Settings oder die Transfer Function größer darstellt. Dies ist möglich indem man auf die Menüleiste des jeweiligen Fensters klickt. Wenn man die Settings wieder minimieren will reicht ein erneuter Klick auf die Menüleiste aus.

Rendering Ansichten:

Standardmäßig werden in der Rendering Ansicht vier verschiedene Darstellungen eingeblendet. 3 zweidimensionale Ansichten welche den Datensatz in Schichten (Slices) entlang der drei Hauptachsen anzeigen und eine volumetrische Darstellung welche die Render-Ergebnisse der Exercise 2 und Exercise 3 anzeigt. Mit der linken Maustaste kann man in den 2D Ansichten die Slicing Position verändern. Die 2D Ansichten sind dabei miteinander verlinkt, sodass die Änderung der Slice-Position in einer Ansicht auch die anderen zwei Ansichten beeinflusst. Bei der volumetrischen Ansicht kann man mit der linken Maustaste das Volumen drehen. Bei allen vier Ansichten kann man mit der rechten Maustaste hinein- oder heraus-zoomen. Mit der mittleren Maustaste kann man den Datensatz in einer Ansicht verschieben.

Es ist auch eine Navigation mittels der Tastaturen in allen vier Ansichten möglich. Mit den Cursor-Tasten kann ein Datensatz entweder rotiert werden oder eben die Slice Position verschoben werden. Mit der Home-Taste kann man alle Rotationen, Skalierungen und Verschiebungen wieder zurücksetzen.

In jeder einzelnen Ansicht befinden sich oben rechts am Fensterrand folgende Icons:

Ansichtsoptionen

Der erste Icon erzeugt einen Screenshot des Inhalts der jeweiligen Ansicht. Der Screenshot wird als ein PNG im Ordner "\res" des Installationsverzeichnisses gespeichert. Dies ist nützlich falls man eine Frage bezüglich der Implementierung im Informatik Forum stellen will. Mit den 3 Buttons auf der rechten Seite kann das jeweilige Ausgabefenster entweder maximiert werden, geschlossen werden oder ein an eine benutzerdefinierte Größe angepasst werden.

Wenn man mit der rechten Maustaste auf der File Menüleiste klickt, öffnet sich das Menü zum Zeigen/Schliessen der Ansichten bzw. vom Settings Fenster.

Aktivieren von Ansichten und Settings Panel

Wenn man bei einer Ansicht über die Menüleiste fährt dann werden Icons für alle Plugins angezeigt welche in der jeweiligen Ansicht verwendet werden können. In folgendem Screenshot werden die verschiedenen Plugins für das Volumenrendering angezeigt:

Cutting Plane

Die verschiedenen Plugins können durch einfaches anklicken aktiviert oder deaktiviert werden. Bei der Boundingbox gibt es auch noch die Option einer Clipping Plane für die Exercise 3 (siehe Clipping Plane in der Abbildung). Die Position der Clipping Plane kann verändert werden indem man die Shift-Taste gedrückt hält und danach mit der linken Maustaste die Clipping Plane verschiebt.

Für die Exercise 2 und Exercise 3 ist es auch möglich sie im Volumenrendering komplett auszublenden. Dies kann entweder mittels der Plugin-Buttons im 3D View gemacht werden oder auch über die VisLab Settings (dort kann man nicht nur zwischen der Reference und der Exercise wechseln, man kann auch alle beide deaktivieren).

VisLab Settings:

Die Steuerung der wichtigsten Parameter für jede Exercise findet sich in den VisLab Settings. Ganz oben befindet sich ein Drop-Down Menü in dem man zwischen zwei Datensätzen auswählen kann (cthead und stagbeetle). Darunter befinden sich 3 Tabs für jede Exercise. In jedem einzelnen Tab kann zwischen der Referenzlösung und der eigenen Implementierung (Exercise) umgeschalten werden. Dies soll dazu dienen um die eigene Implementierung mit der Referenz visuell vergleichen zu können.

Die Beschreibungen zu den einzelnen Parametern für jede Exercise finden sich auf der entsprechenden Homepage zum Beispiel.

Settings

Unter den Parameter gibt es zu jeder Exercise auch noch einen Quick Guide. Hier werden die wichtigsten Eigenschaften beschrieben. Die Links in diesem Text setzten die Parameter für auf die entsprechenden Werte um den beschriebenen Effekt zu erzielen.

Transfer Function:

Die Transfer Function wird nur in Exercise 3 verwendet. Im Editor kann einerseits die Opazität für bestimmte Datenwerte sowie auch die Farbe verändert werden. Die runden Kontrollpunkte dienen der Kontrolle der Opazität. Die Kurve welche die verschiedenen Punkte verbindet beschreibt die gesamte Funktion entlang aller Datenwerte. Vor dem ersten Kontrollpunkt und nach dem letzten Kontrollpunkt bleibt der Opazitätswert konstant auf dem Wert des Kontrollpunkts (auch wenn keine Linie eingezeichnet wird).

Einen einzelnen Kontrollpunkt kann man mittels der linken Maustaste verschieben. Um einen neuen Kontrollpunkt zu erzeugen reicht ein rechter Mausklick an einer beliebigen Stelle des Transfer Functionen Editors. Ein Kontrollpunkt kann durch das anklicken mit der rechten Maustaste wieder gelöscht werden.

Transfer Functionen Editor

Am oberen Rand des Editors können die Farbwerte eingestellt werden. Diese dreieckigen Kontrollpunkte können auch auf dieselbe Art manipuliert werden wie die Kontrollpunkte für die Opazität. Der Farbwert eines Kontrollpunktes kann aus einer Farbpalette gewählt werden welche nach einem Doppelklick auf den Kontrollpunkt erscheint.

Es ist auch möglich eine bestehende Transfer Funktion zu laden. Für jeden Datensatz ist ein Preset im Framework enthalten. Um ein Preset zu laden, muss man auf den kleinen Pfeil über den rechten oberern Eck des Transfer Funktionen-Bereichs klicken. Dort erscheinen dann bestehenden Transfer Funktionen und auch die Option "Save Preset...". Mittels dieser Option kann die aktuelle Transfer Funktion zu der Liste von Transfer Funktionen hinzugefügt werden. Jedoch muss auch noch zusätzlich das Projekt gespeichert werden damit die Transfer Funktion nach dem Schließen nicht verloren geht. Eine andere Möglichkeit eine Transfer Funktion zu speichern, ist das Erzeugen eines Snapshots (siehe nächsten Absatz).

Projekdaten Sichern:

Falls man bestimmte im Projekt vorgenommen Änderungen speichern will, ist die beste Möglichkeit dies mittels eines Snapshots zu machen. Ein Snapshot speichert alle relevanten Einstellungen (alle Parameter, Transfer Function, Rotationen, ...). Um einen Snapshot zu machen reicht ein Klick auf den Icon im Snapshot-Tab im oberen Bereich des Fensters. Dies erzeugt einen neuen Eintrag in der Liste von Snapshots.

Ein gemachter Snapshot kann dann wieder geladen werden indem man ihn in der Liste auswählt und auf den Button Restore Snapshot klickt. Auf ähnliche Weise kann ein gemachter Snapshot auch wieder gelöscht werden.

Snapshot



Programmierung

Jede einzelne Exercise für die Visualisierung 1 ist ein eigenes Plugin und daher auch unabhängig von den anderen Exercises. Jedes Plugin hat auch eine eigene Projektdatei. Im Startmenüeintrag kann ein Link zu den Projektdateien der einzelnen Exercises gefunden werden. Die Projekte beinhalten bereits alle benötigen Dependencies. Daher ist es möglich jede Exercise direkt nach dem ersten öffnen der Projektdatei in Visual Studio 2008 zu kompilieren.

In den jeweiligen Plugins fehlen jeweils nur kleine Teile des Codes welche im Zuge der Übung implementiert werden sollen. Im Code sind diese Stellen mit einem entprechenden Tag als Kommentar markiert (z.B. TASK 3 oder TASK BONUS). Es kann also einfach nach diesen Tags im Code gesucht werden, um an die richtige Stelle zu gelangen.

Das Kompilieren eines Plugins erzeugt eine DLL Datei welche automatisch an die richtige Stelle im Framework kopiert wird und dort vom Volumeshop verwendet wird. Dies gilt auch für die Shader Programme welche in Exercise 2 und 3 verwendet werden.

Um einen Debugvorgang zu starten sind in den Projektdateien auch schon alle Variablen gesetzt damit der Volumeshop mit den entsprechenden Settings startet. Von unserer Seite wird empfohlen möglichst immer im Release-Modus zu kompilieren. Wenn man dann das Programm ohne Debug-Modus startet (Strg + F5 in Visual Studio 2008) dann ist es auch nicht nötig den Volumeshop zu schließen wenn man Änderungen am Code vornimmt und das Plugin neu kompiliert. Das neu kompilierte Plugin wird nach dem Kompiliervorgang automatisch im Volumeshop neu geladen. Dies erspart viel Zeit speziell wenn man sich mit einzelnen Paramtern im Shader Code spielen will.

Shader Programmierung:

Ein Großteil der Programmierung für den Übungsteil erfolgt auf der Grafikkarte. Dadurch ist es möglich komplexe Visualisierungstechniken mit interaktiven Frameraten darzustellen. Von den geometrischen Primitiven und Texturen bis zum fertigen Bild am Bildschirm sind einige Prozessschritte erforderlich. Diese Prozessschritte werden in effizienter Weise (parallel computing) direkt auf der Grafikkarte ausgeführt. Die folgende Grafik zeigt eine vereinfachte Darstellung dieser Prozesspipeline wie sie seit OpenGL 2.1 besteht:

Prozesspipeline auf der Grafikkarte

Die mit rot hinterlegten Prozessschritte sind die sogenannten Shader Programme welche entweder auf einen Vertex (verändern eines Eckpunktes), auf eine Geometrie (erzeugen oder verändern einer Geometrie) oder auf ein Fragment/Pixel (Manipulation des Pixels) angewendet werden. Diese Prozessschritte können seit OpenGL 2.1 auch vom Benutzer mit eigenen Shader Programmen überschrieben werden. Dazu muss ein entsprechendes Shader Programm vor dem ausführen der Grafikpipeline auf die Grafikkarte geladen werden. Volumeshop beinhaltet bereits eine Methode welche diese Aufgabe übernimmt. In den Exercises muss daher nur der jeweilige Shader Code in eine bereits vorhandene *.glsl Datei geschrieben werden. Die in der obigen Grafik zusätzlich dargestellten Tags dienen dazu den Shader Code einem Shader Programm auf der Grafikkarte zuzuordnen. Volumeshop verwendet dann die *.glsl Datei und schreibt den Shader Code dann in die entsprechenden Shader Programme auf der Grafikkarte.

Die Shader Programmierung unterscheidet sich ein wenig von der C++ Programmierung, da der Shader Code erst zur Laufzeit auf der Grafikkarte kompiliert wird. Das heißt dass man keine Fehlermeldung bei möglichen Programmierfehlern bekommt wenn man das Plugin kompiliert. Fehler werden erst zur Laufzeit im Ausgabefenster des Volumeshops angezeigt (roter Text mit der jeweiligen Fehlermeldung). Die Sprache welche in der Übung zur Shader Programmierung verwendet wird ist GLSL. Wir haben uns für diese Sprache entschieden da sie sehr ähnlich zu C++ ist. In GLSL gibt es eine Menge von vordefinierten Funktionen welche die Programmierung erheblich erleichtern. Das folgende PDF liefert eine Übersicht über die wichtigsten vordefinierten Funktionen und Variablen in GLSL:

GLSL Referenz

Bei der Shader Programmierung sollen nur Funktionen verwendet werden welche sich auch in dieser Liste finden, da wir sonst nicht garantieren können dass deine Implementierung auf unseren Rechnern fehlerfrei läuft!

Abgabesystem

Vor der Abgabe mittels unseres Vis1 Abgabesystems sollte man mit dem Submission Generator eine ZIP Datei der jeweiligen Exercise erzeugen. Im Submission Generator Tool wählt man dazu nur die jeweilige Exercise aus und klickt auf "Generate Assignment":

Submission Generator

Das Tool erzeugt eine ZIP Datei mit allen für die Abgabe relevanten Dateien. Die ZIP Datei kann dann anschließend im Abgabesystem hochgeladen werden.