VoluRen - Depth Of Field Volume Renderer
Bei VoluRen handelt es sich um ein Tool, das im SS 2013 im Zuge der Lehrveranstaltung Visualisierung 2 (186.833) von Matthias Adorjan erstellt wurde. Es ist ein Volumerenderer der 8-Bit RAW-Datensätze visualisieren kann. Zusätzlich wurde, wie man am Titel bereits erkennen kann, ein Tiefenschärfeeffekt implementiert. Bei der Implementierung des Effekts wurde nach den Beschreibungen des Papers Depth of Field Effects for Interactive Direct Volume Rendering von Schott et al. vorgegangen.
Das Tool basiert auf DirectX 11 mit HLSL Shader Model 5. Dabei wurde SharpDX als managed DirectX API verwendet und WinForms mit einem MetroUI-Style für das Graphical User Interface.
Bei der Implementierung wurde strikt nach den Erkenntnissen des Papers vorgegangen. Der Renderer verwendet für die Visualisierung der Volumensdaten einen slice-based Ansatz. Nach dem PreProcessing-Schritt, bei dem Gradienten mit der Central-Difference-Methode berechnet und mit einem 3x3x3 Gauss-Filter gefiltert werden, wird das Volumen in view-aligned Slices geteilt. Dafür ist es notwendig für jeden einzelnen Slice eine Proxygeometrie zu berechnen. Dazu werden die Slices jeweils mit der BoundingBox des Volumens geschnitten. Danach wird von den Schnittpunkten der Mittelwert errechnet und alle Punkte inklusive Mittelwert auf die XY-Plane projiziert. Um nun ein Proxypolygon erzeugen zu können werden die Schnittpunkte je nach Winkel zum Mittelpunkt sortiert. Schlussendlich werden anhand der sortierten Punktliste die Dreiecke für das Polygon erzeugt. Beim Rendern der Slices wird anhand des Iso-Wertes des Voxels ein Lookup auf jeweils vordefinierte Transferfunktionen ausgeführt. Auf den so erhaltenen Farbwert wird mithilfe der Gradienten und einer statischen Lichtquelle noch ein diffuses Beleuchtungsmodell angewandt.
Um den Tiefenschärfeeffekt zu erzielen, werden die Slices beim Rendern vor der Fokusebene in Front-To-Back Reihenfolge und hinter der Fokusebene in Back-To-Front Reihenfolge traversiert. Mithilfe eines Intermediate- (bei Front-To-Back) und eines Eye-Buffers (bei Back-To-Front) wird das Blurring der einzelnen Slices durchgeführt. Dabei werden basierend auf den View-Space Zerstreuungskreisen des aktuellen Slices, welche zuvor noch in Texture-Space umgerechnet werden müssen, N=4 Samples des vorhergehenden Buffers gemittelt und das Ergebnis in den aktuellen Buffer geschrieben. Bei der Traversierung der Slices wird vor jeder Ebene der aktuelle Buffer mit dem nächsten geswapt, um ein inkrementelles Blurring zu ermöglichen. Am Ende der Traversierung wird der Intermediate-Buffer mithilfe der Over-Operation auf den Eye-Buffer geblendet und das Ergebnis in den Framebuffer geschrieben.
Das Interface des Tools besteht im Großen und Ganzen aus 2 Fenstern. Das Hauptfenster enthält das RenderControl und das ControlPanel mithilfe dem der Benutzer verschiedene Parameter des Tiefenschärfeeffekts anpassen kann:
Zusätzlich zu den GUI-Elementen gibt es noch eine Mouse-Steuerung mit der die Kamera bewegt und rotiert und das Volumen rotiert werden kann. Liegt der Fokus beim RenderControl (MouseOver) so kann folgendermaßen interagiert werden:
Das zweite Fenster ist ein Auswahlfenster. Zu diesem gelangt man über den Load Volume-Button des Hauptfensters. Hier hat der Benutzer die Wahl zwischen 4 mitgelieferten Volumensdatensätzen, die visualisiert werden können. Wählt er einen der 4 aus und bestätigt mit OK, wird der Datensatz im RenderControl des Hauptfensters dargestellt. Mit Cancel kehrt man ohne Änderung zurück zum Hauptfenster.