Beschreibung
Das Framework für die Programmierbeispiele der Visualisierung 1 VU basiert auf Volumeshop. Dabei handelt es sich um ein plugin-basiertes Framework für die schnelle Entwicklung von Visualisierungstechniken basierend auf C++ und Qt. Volumeshop wurde am Institut für Computergraphik und Algorithmen an der TU Wien entwickelt.
Installation
Das Framework wird als Windows Installer ausgeliefert. Nach dem Download kann es an einem beliebigen Ort installiert werden. Bitte beachten Sie dabei, dass während der Installation kein neuer Ordner erstellt wird - die Dateien werden alle in den während dem Setup angegebenen Ordner kopiert. Nach der Installation sollten im Windows Startmenü folgende Einträge zu sehen sein:
Der Menüeintrag Generate Submission startet ein Tool, welches zum Erzeugen der Abgabe verwendet werden kann. Die Menüeinträge Volumeshop starten das Framework im Release-Modus (entweder 32 oder 64 bit) mit allen benötigten Einstellungen und Plugins für die Visualisierung 1 Übung. Der Ordner Exercise enthält zwei Einträge für jeweils einen Übungsteil. Darin befinden sich Links zu den zugehörigen Visual Studio Projektdateien. Mittels Uninstall Visualisierung 1 wird das Framework deinstalliert (die Projektdateien und die Menüeinträge werden gelöscht).
Programmierung
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. TODO 3). Man kann also einfach nach diesen Tags im Code suchen, um an die richtige Stelle zu gelangen.
Kompilieren der Beispiele
Das Kompilieren eines Plugins erzeugt eine DLL Datei welche automatisch an die richtige Stelle im Framework kopiert wird, um dort von Volumeshop verwendet zu werden. Dies gilt auch für die Shader-Programme welche in den Beispielen verwendet werden. Nach der Installation sollte die ganze Solution einmal kompiliert werden. Danach folgendes beachten:
Zum Kompilieren der Beispiele am besten immer den Befehl Build verwenden (nicht Rebuild). Außerdem möchst immer nur das Plugin-Projekt selbst, nicht die gesamte Solution kompilieren.
Folgende Build-Befehle sind möglich:
- rechte Maustaste auf Projekt (z.B. plugin_editor_vislabfilterexercise) -> Build
- rechte Maustaste auf Projekt (z.B. plugin_editor_vislabfilterexercise) -> Project Only -> Build Only
- rechte Maustaste auf Projekt (z.B. plugin_editor_vislabfilterexercise) -> Build
- rechte Maustaste auf Projekt (z.B. plugin_editor_vislabfilterexercise) -> Project Only -> Build Only
Um einen Debugvorgang zu starten, wurden in den Projektdateien bereits alle Variablen gesetzt, um Volumeshop mit den entsprechenden Settings zu starten. Von unserer Seite wird aber empfohlen, möglichst immer im Release-Modus zu kompilieren. Wenn man dann das Programm ohne Debug-Modus startet (Strg + F5 in Visual Studio), ist es auch nicht nötig, 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 die Auswirkung einzelner Parametern im Shader Code ausprobieren möchte.
Sie können die Projekte entweder als Win32- oder als x64-Projekt kompilieren. Die Inhalte im Ordner bin des Frameworks sollten nicht händisch komplett gelöscht werden, da sich hier einige vorkompilierte DLL Dateien und Libraries befinden. Sollten Sie die Inhalte versehentlich gelöscht haben, können Sie hier die Dateien noch einmal herunterladen:
BIN (Visual Studio 2010) | BIN (Visual Studio 2012) | BIN (Visual Studio 2013) |
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:
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 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 von Volumeshop 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:
GLSL Referenz |
Bei der Shader-Programmierung sollen nur Funktionen verwendet werden, welche sich auch in dieser Liste finden. Ansonsten können wir nicht garantieren, dass die Implementierung auf unseren Rechnern fehlerfrei läuft.
Abgabesystem
Die Abgabe der Übungsbeispiele erfolgt über unser Vis1 Abgabesystem Vor jeder Abgabe 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 dann auf Generate Assignment:
Das Tool erzeugt eine ZIP-Datei mit allen für die Abgabe relevanten Dateien. Die ZIP Datei kann dann anschließend im Abgabesystem (https://lva.cg.tuwien.ac.at/vis1/) hochgeladen werden.
Volumeshop
Die folgende Abbildung zeigt das Setup des Volumeshops für die Visualisierung 1 Übung:
Im linken Bereich der Abbildung sieht man die verschiedenen Rendering-Ansichten. Im rechten Bereich sind die VisLab 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 jedes Fensters). Um die entkoppelten Fenster wieder zurück an das Hauptfenster zu koppeln, genügt ein Doppelklick in der Menüleiste des entkoppelten Fensters.
Besonders bei kleineren Bildschirmen (Laptop) ist es manchmal notwendig, dass man entweder die VisLab Settings oder die Transferfunktion größer darstellt. Dies ist möglich, indem man auf die Menüleiste des jeweiligen Fensters klickt. Will man die Settings wieder minimieren, genügt ein erneuter Klick auf die Menüleiste.
Rendering-Ansicht
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
- 1 volumetrische Darstellung, welche die Render-Ergebnisse 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:
Das 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 möchte. Mit den drei letzten Icons in der Reihe kann das jeweilige Ausgabefenster entweder an eine benutzerdefinierte Größe angepasst, maximiert, oder geschlossen werden.
Wenn man mit der rechten Maustaste auf den Menüeintrag File in der Menüleiste klickt, öffnet sich das Menü zum Zeigen/Schliessen der Ansichten bzw. vom Settings-Fenster. 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. Die verschiedenen Plugins können durch einfaches anklicken aktiviert oder deaktiviert werden:
Bei der Boundingbox gibt es auch noch die Option eine Clipping Plane zu verwenden. 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:
VisLab-Settings
Die VisLab-Settings beinhalten Steuerungselemente für die wichtigsten Parameter jeder Exercise. Ganz oben befindet sich ein Drop-Down Menü, in dem man zwischen zwei Datensätzen wechseln kann (cthead und stagbeetle). Darunter befinden sich drei Tabs; in jedem einzelnen Tab kann zwischen der Referenzlösung und der eigenen Implementierung (Exercise) umgeschalten werden.
Die Links im Quick-Guide setzten Parameter auf die beschriebnen Werte, um den beschriebenen Effekt zu erzielen.
Transfer Function:
Die Transferfunktion wird nur beim Volumerendering verwendet. Im Editor kann einerseits die Opazität, als auch die Farbe, für bestimmte Datenwerte 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 Transferfunktionen-Editors. Ein vorhandener Kontrollpunkt kann durch das Anklicken mit der rechten Maustaste wieder gelöscht werden.
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 Transferfunktion zu laden. Für jeden Datensatz ist ein Preset im Framework enthalten. Um ein Preset zu laden, muss man auf den kleinen Pfeil über dem rechten oberen Eck des Transferfunktionen-Bereichs klicken. Dort erscheint dann neben der Liste bestehender Transferfunktionen auch die Option Save Preset.... Mittels dieser Option kann die aktuelle Transferfunktion zu der Liste von Transferfunktionen hinzugefügt werden. Jedoch muss auch noch zusätzlich das Projekt gespeichert werden, damit die Transferfunktion nach dem Schließen nicht verloren geht. Eine andere Möglichkeit eine Transferfunktion 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 (Parameter, Transferfunktion, Rotationen,...). Um einen Snapshot zu machen reicht ein Klick auf das Icon im Snapshot-Tab im oberen Bereich des Fensters. Dies erzeugt einen neuen Eintrag in der Liste von Snapshots.
Ein gespeicherter Snapshot kann 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.