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:

Startmenüeinträge

Der Menüeintrag Volumeshop startet Volumeshop im Release-Modus mit allen benötigten Einstellungen und Plugins für die Visualisierung 1 Übung. Der Menüeintrag Generate Submission startet ein Tool, welches zum Erzeugen der Abgabe verwendet werden kann. Der Ordner Exercise enthält drei Unterordner für jeweils einen Übungsteil. Darin befinden sich Links zu den zugehörigen Visual Studio 2008 Projektdateien.

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:

Volumeshop

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ü 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
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

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:

Aktivieren von Ansichten und Settings Panel

Bei der Boundingbox gibt es auch noch die Option eine Clipping Plane zu verwenden (für die Exercise 3). 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:

Cutting Plane

Es ist auch möglich, die Ergebnisse der Exercise 2 und 3 komplett aus dem Volumenrendering 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 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.

Settings

Genauere Beschreibungen der einzelnen Parametern finden sich jeweils auf den Homepages der Exercises.

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.

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 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.

Snapshot

Ein gemachter 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.

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.

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

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.