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:
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:
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:
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.
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.
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.
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.
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.
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:
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.
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).
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.
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.
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).
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.
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:
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!
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.
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 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!