Einleitung

In diesem Beispiel geht es darum einen Volumenrenderer zu vervollständigen. Volumenrendering ermöglichst es, einen Datensatz in seiner Gesamtheit besser zu verstehen. Im Gegensatz dazu zeigen die 2D Ansichten der Daten nur Slices durch den Datensatz. In diesen kann man zwar einzelne Schichten genau analysieren, jedoch ist es sehr schwierig sich vorzustellen wie der gesamte Datensatz aussieht. Beim Volumenrendering kann man durch die Möglichkeit Bereiche transparent oder halb-transparent darzustellen einen Bezug zwischen den einzelnen Bereichen der Daten herzustellen.

Beschreibung

Als Ausgangspunkt für das Volumenrendering dient das Volumen welches in Beispiel 1 erstellt wurde. Es enthält neben den Datenwerten auch den Gradienten, welcher im Laufe dieses Beispiels für das korrekte Rendering benötigt wird.
Als Rendering-Technik soll in diesem Beispiel Raycasting implementiert werden. Es ist zurzeit die am meisten verwendete Volumenrendering-Technik, da sie sehr einfach im Fragment Shader implementiert werden kann und auch viel Flexibilität bietet.
Um die Darstellung zu kontrollieren, spielt bei diesem Beispiel auch die Transferfunktion eine wesentliche Rolle. Sie bestimmt mit welcher Farbe/Opazität ein bestimmter Datenwert dargestellt wird. Durch die Manipulation der Transferfunktion können bestimmte Teile der Daten halb-transparent dargestellt werden oder auch komplett ausgeblendet werden. Damit ist es möglich die volumetrischen Daten genauer zu untersuchen. Die folgenden Bilder zeigen, wie die Resultate nach diesem Beispiel etwas aussehen könnten:

Plugin

Von den drei vorhandenen Shader-Dateien ist in diesem Beispiel nur plugin_renderer_vislabvolumeexercise_volume.glsl zu bearbeiten.
Der Source Code des Plugins besteht aus den Dateien RendererVisLabVolumeExercise.h|cpp und insgesamt drei Shader-Dateien. In C++ wird alles für das Rendering geladen und an die Grafikkarte weitergegeben, und in den Shader-Dateien werden die Eintritts- und Austrittspunkte der Rays auf der Grafikkarte ermittelt.

Programmieraufgaben

TODO Beschreibung
1
Direct Volume Rendering
In dieser Aufgabe soll Direct Volume Rendering (DVR) mittels Alpha-Compositing und dem Over-Operator (siehe http://en.wikipedia.org/wiki/Alpha_compositing) implementiert werden. In der Referenzlösung im Framework wird Front-To-Back Compositing verwendet.
2
Opacity Correction
Beim Raycasting beeinflusst der Abstand der Sample Punkte (Schrittweite) die Qualität der Resultate erheblich. Je kleiner der Abstand zwischen zwei aufeinander folgender Sample-Punkte entlang des Strahls desto besser ist der Ergebnis. Bei einer großen Schrittweite werden Artefakte sichtbar. Die Ursache dafür ist, dass beim Raycasting im Wesentlichen eine numerische Integration durchgeführt wird. Bei einer größeren Schrittweite wird entlang des Strahls weniger Opazität akkumuliert, weshalb das Volumen transparenter erscheint als bei einer kleineren Schrittweite. Jedoch wollen wir, dass für verschiedene Schrittweiten das Volumen immer mit derselben Opazität erscheint.
In dieser Aufgabe soll eine Korrektur der Opazität basierend auf der Schrittweite (Opacity Correction) durchgeführt werden. In der Implementierung wird die Schrittweite mittels der Variable fSampleDistance als Uniform Parameter an den Shader übergeben. Die Transferfunktion ist definiert für eine Schrittweite von 1.0. Wenn die Schrittweite kleiner wird, muss die Opazität reduziert werden. Bei einer größeren Schrittweite muss die Opazität dementsprechend erhöht werden.
Die Details zur Berechnung der Opazitäts-Korrektur können im Kapitel 2.2 im Paper von Schulze et al. gefunden werden: Schulze03b.pdf. Die Formel zur Berechnung der Opacitätskorrektur findet sich auf Seite 3 (erste Formel). Es ist übrigens nicht notwendig einen Lookup-Table zu erzeugen, sondern es genügt, die Korrektur der Opazität direkt am Alpha-Wert des Sample-Punkts aus der Transferfunktion durchzuführen.
3
Blinn-Phong Shading
In dieser Aufgabe soll Gradient-Based Shading implementiert werden, um die Visualisierung zu verbessern. Zur Berechnung des Shadings verwenden wir den Gradientenvektor als Oberflächennormale an der Stelle des Sample-Punkts. Mittels der Oberflächennormale kann Blinn-Phong Shading durchgeführt werden (siehe http://en.wikipedia.org/wiki/Phong_reflection_model). Die Implementierung sollte folgende Parameter zur Beeinflussung des Shadings berücksichtigen:
  • Diffuses Shading (uniform parameter fDiffuseShading): Kontrolliert den diffusen Anteil beim Shading (zwischen null und eins, null bedeutet kein diffuser Anteil).
  • Specular Shading (uniform parameter fSpecularShading): Kontrolliert den spiegelnden (specular) Anteil beim Shading (zwischen null und eins, null bedeutet kein spiegelnder Anteil).
  • Specular Exponent (uniform parameter fSpecularExponent): Der Exponent welcher für den spiegelnden Anteil in der Shading Formel verwendet wird (je höher dieser Wert ist desto kleiner wird der Glanzpunkt und desto glänzender/spiegelnder erscheint die Oberfläche).
Die Argumente der Funktion, in welcher das Shading implementiert werden soll, sind der Farbwert aus der Transferfunktion (vecColor), der Lichtvektor (vecLight), der normalisierte Gradientenvektor (vecGradient) und der Gradientenbetrag (fMagnitude).
4
Gradient-Magnitude Shading-Modulation
Da es nicht viel Sinn macht ein Shading bei einem sehr kleinen Gradientenbetrag durchzuführen (z.B. in Regionen in denen der Datenwert konstant ist), gibt es die Möglichkeit die Länge des Gradientens zu verwenden, um den Einfluss des Shadings zu beeinflussen.
In dieser Aufgabe soll diese Shading-Modulation, beeinflusst durch den Gradientenbetrag, implementiert werden. Bei einem kleinen Gradientenbetrag sollte weniger Shading verwendet werden als bei einem großen Gradientenbetrag. Um diesen Effekt zu steuern gibt es im GUI einen Parameter Gradient Shading, welcher als fGradientShading (uniform variable) an den Shader geschickt wird. Der Parameter sollte nach der Implementierung dieses Task folgende Auswirkung auf die Visualisierung haben:
  • Wert gleich 0 -> das Shading soll nur auf Sample-Punkte mit einem hohen Gradientenbetrag angewendet werden
  • Wert gleich 1 -> das Shading soll auf alle Sample-Punkte angewendet werden
Zwischen diesen beiden Extrema soll ein gleichmäßiger Übergang implementiert werden (mittels Interpolation mit dem GLSL-Befehl smoothstep zwischen dem Farbwert mit und ohne Shading).
5
Gradient-Magnitude Opacity-Modulation
Als Alternative zum vorherigen Schritt kann auch die Opazität basierend auf dem Gradientenbetrag angepasst werden.
In dieser Aufgabe soll Opacity-Modulation basierend auf dem Gradientenbetrag implementiert werden. Das bedeutet, dass konstante Regionen transparent werden, während Übergangsbereiche eine hohe Opazität haben. Dadurch werden Übergangsbereiche visuell hervorgehoben. Zur Steuerung dieser Modulation steht im GUI ein Parameter namens Gradient Opacity zur Verfügung. Der Wert dieses Parameters wird an die Variable fGradientOpacity im Shader weitergegeben. Die Modulation sollte ähnlich wie im Task zuvor funktionieren:
  • Wert gleich 0 -> nur Sample-Punkte mit hohem Gradientenbetrag sollen sichtbar sein
  • Wert gleich 1 -> der Gradientenbetrag hat keinen Einfluss auf die Transparenz von Sample-Punkten
Zwischen diesen Werten soll wieder ein gleichmäßiger Übergang implementiert werden (Interpolation mit dem GLSL-Befehl smoothstep und anschließender Multiplikation mit dem Alpha-Wert des Sample Punkts).
Für weitere Details siehe das Paper von Levoy:
http://graphics.stanford.edu/papers/volume-cga88/
BONUS
Implementierung einer weiteren Volume-Rendering Technik
Sei kreativ - implementiere deine eigene Visualisierungstechnik für Zusatzpunkte!
Im GUI steht dafür die Auswahl Custom zur Verfügung. Im Shader-Code kann für diese Option eine eigene Visualisierungstechnik implementiert werden. Im Shader steht der zusätzliche Parameter fCustom mit Werten zwischen 0 und 1 zur Manipulation der Technik zur Verfügung.
Hier sind einige Inspirationsquellen (es kann eine dieser Methoden implementiert werden, aber es sind natürlich auch Variationen dieser möglich und erwünscht):
Bei der Implementierung sollte im Auge behalten werden, welches Ziel die neue Visualisierungstechnik verfolgt (z.B. welche Aspekte der Daten werden besser hervorgehoben?). Außerdem sollte ein klarer Unterschied zwischen Standard-DVR und der neuen Methode ersichtlich sein (und beim Abgabegespräch erläutert werden).

User Interface

Folgende GUI-Parameter stehen zur Verfügung um das Volume-Rendering zu beeinflussen:

Name Effekt Zeigt Auswirkungen
Transfer Function Die Transferfunktion dient dazu Datenwerte auf optische Eigenschaften (Farbe und Opacity) abzubilden. Sie wird verwendet um bestimmte Wertebereiche der Daten auszublenden oder hervorzuheben. Mit unterschiedlichen Farben ist es auch möglich verschiedene Teile der Daten voneinander zu unterscheiden. ab TODO 1
Sample Distance Gibt den Abstand zwischen zwei Sample Punkten entlang des Strahls beim Raycasting an. Je kleiner der Wert desto besser ist die Renderingqualität aber auch desto länger dauert das Rendering. ab TODO 1
Technique Hier kann zwischen verschiedenen Rendering Techniken gewechselt werden. MIP ist standardmäßig schon in der Exercise implementiert. Die anderen Techniken sind selber zu implementieren. immer
Shading Mit dieser Option kann das Shading aktiviert oder deaktiviert werden. ab TODO 3
Shading Intensity Wie stark die Beleuchtungssituation das Volumenrendering beeinflusst (0 = nur Farben, 1 = maximales Shading) ab TODO 3
Diffuse Shading Diffuse Komponente des Beleuchtungsmodels
(Details siehe hier)
ab TODO 3
Specular Shading Spiegelnde Komponente des Beleuchtungsmodels
(Details siehe hier)
ab TODO 3
Specular Exponent Glattheit des Materials, beeinflusst die spiegelnde Reflexion
(Details siehe hier)
ab TODO 3
Gradient Shading Dieser Wert reguliert das Shading basierend auf den Gradientenwert (1 = Shading wird immer angewendet, auch wenn der Gradientenbetrag 0 ist; 0 = Shading wird nie angewendet, auch wenn der Gradientenbetrag 1 ist) ab TODO 4
Gradient Opacity Mit diesem Wert kann man die Opacity basierend auf den Gradientenbetrag regulieren (1 = Opacity wird duch den Gradienten nicht beeinflusst; 0 = Gradientenbetrag hat maximalen Einfluss auf die Opacity (je kleiner der Gradientenbetrag desto kleiner die Opacity)) ab TODO 5
Custom Dieser Parameter kann verwendet werden um die in der Bonusaufgabe implementierte Visualisierungstechnik zu manipulieren. Der Wert kann zwischen 0 und 1 variiert werden. Im Shader kann auf die Variablen mit fCustom zugegriffen werden. BONUS