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ü Computergraphik und Algorithmen an der TU Wien entwickelt.
Die Programmierbeispiele für die VU sind als einzelne Volumeshop-Plugins implementiert. Neben Volumeshop inkludiert das gesamte Framework die einzelnen
Projekt- und Source-Dateien für die einzelnen Programmieraufgaben sowie ein kleines Tool zum Erzeugen der Abgabe.
Installation
Das Framework wird als Windows Installer ausgeliefert (Download: verfügbar nach der Vorbesprechung). Nach dem Download kann es an einem beliebigen Ort installiert
werden. Nach der Installation sollten im Windows Startmenü folgende Einträge zu sehen sein:
Volumeshop
Die in der Visualisierung 1 implementierten Teilaufgaben beruhen alle auf Volumeshop. Jede einzelne Aufgabe befindet sich in einem eigenen Plugin, welches von
Volumeshop geladen wird. Das Visualisierung 1 Framework enthält auch eine Volumeshop-Projektdatei, 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:
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ü ein erneuter Klick auf die Menüleiste.
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:
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:
Im Fenster unter den Parametern gibt es zu jeder Exercise auch noch einen Quick-Guide. Hier werden die wichtigsten Aufgaben der Exercise beschrieben. Die Links in diesem Text setzten die Parameter für auf die entsprechenden Werte, um den beschriebenen Effekt zu erzielen.
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.
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 oberern 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).
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ü 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 der Exercise 2 und Exercise 3 anzeigt
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:
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:
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, jeweils einer pro Exercise. In jedem einzelnen Tab kann zwischen der Referenzlösung und der eigenen Implementierung (Exercise) umgeschalten werden. Dies soll dazu dienen, die eigene Implementierung mit der Referenz visuell vergleichen zu können.Im Fenster unter den Parametern gibt es zu jeder Exercise auch noch einen Quick-Guide. Hier werden die wichtigsten Aufgaben der Exercise beschrieben. Die Links in diesem Text setzten die Parameter für auf die entsprechenden Werte, um den beschriebenen Effekt zu erzielen.
Transfer Function:
Die Transferfunktion wird nur in Exercise 3 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.
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 oberern 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.Programmierung
Jede Exercise für der Visualisierung 1 ist ein eigenes Plugin und daher auch unabhängig von den anderen Exercises. Jedes Plugin hat auch eine eigene
Projektdatei. Im Windows Startmenüeintrag sind Link zu den Projektdateien der einzelnen Exercises vorhanden. 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). Man kann also einfach nach diesen Tags im Code suchen, 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, um dort von Volumeshop verwendet zu werden. Dies gilt auch für die Shader-Programme welche in Exercise 2 und 3 verwendet werden.
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 2008), 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 Paramtern im Shader Code ausprobieren möchte.
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. 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. Ansonsten können wir nicht garantieren, dass die Implementierung auf unseren Rechnern fehlerfrei läuft!
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). Man kann also einfach nach diesen Tags im Code suchen, 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, um dort von Volumeshop verwendet zu werden. Dies gilt auch für die Shader-Programme welche in Exercise 2 und 3 verwendet werden.
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 2008), 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 Paramtern im Shader Code ausprobieren möchte.
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 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. 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. 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 (Link: nach der Vorbesprechung verfügbar). 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: