Beispiel 1 aus LU Visualisierung WS 2006/2007

Download des Programms:VisLU-Release 0.56.zip (127kB)

Link zu Beispielbildern

Aufgabenstellung

Es soll ein Programm entwickelt werden, welche Volumsdaten mittels Raycasting darstellt. Als Grundlage für das Programm soll das Paper von Marc Levoy: "Display of Surfaces from Volume Data" verwendet werden. Da Volumsdaten hier als Dichtewerte repräsentiert sind, wird eine Transferfunktion benötigt. Diese soll auch die rämliche Veränderung der Dichte (Gradient) berücksichtigen.

Die Lösung soll Volumsdaten mittels Raycasting darstellen können, als auch eine einstellbare Transferfunktion zur Verfügung stellen.

Lösung

Das Programm wurde in C# unter Microsoft Visual Studio .Net 2005 mit der Microsoft DirectX 9.0c SDK (Oktober 2006) entwickelt. Zur Ausführung muss mindestens die Redistributable DirectX 9.0c (Oktober 2006), als auch die .NET Runtime 2.0, installiert sein.

Das Programm stellt mehrere Darstellungsmöglichkeiten für Volumsdaten zur Verfügung:

  • Darstellung der Schichten in den 3 Hauptrichtungen
  • Pre-Shaded Slices (ab PixelShader 1.1)
  • Post-Shaded Slices (ab PixelShader 2.0)
  • Raycasting mit diffuser Beleuchtung (ab Pixelshader 3.0)

Die Resultate der einzelnen Techniken unterscheiden sich. Nachfolgend ein Vergleich der Techniken und einer kurzen Beschreibung, wie diese umgesetzt worden sind. (ausgenommen der Darstellung in den 3 Hauptrichtungen):

Pre-Shaded Slices

Die Volumstextur wird vor dem Mappen auf die Proxygeometrie in RGBA-Daten mittels Transferfunktion transferiert. Diese Technik benötigt die wenigsten Texture-Lookups der hier vorgestellten Techniken. Jedoch benötigt eine Änderung der Transferfunktion einig Zeit, da dabei die gesamte Volumstextur neu geschrieben werden muss.

Post-Shaded Slices

Die Volumstexture besteht hier aus den Dichtewerten der Volumsdaten. Desweiteren gibt es eine eigene Texture, welche die Transferfunktion darstellt. Es wird für jeden Pixel auf der Proxygeometrie die dazugehörige Farbe aus der Transfertextur ermittelt. Desweiteren ist in den Kanälen RGB der Volumstextur der Gradient jedes einzelnen Dichtewerts enthalten. Die Qualität dieser Darstellung ist besser, als die des Pre-Shading. Jedoch kommt dies mit dem Nachteil zusätzliche Textur-Lookups durchführen zu müssen.

RayCasting

Hier kommen mehrere Renderschritte zum Einsatz:

Pass 1: Rendern der Frontfaces einer BoundingBox in eine Textur, welche an ihren Ecken farbcodiert die 3D-Texturkoordinaten beinhaltet.

Pass 2: Rendern der Backfaces der selben BoundingBox in eine Textur

Pass 3: Subtraktion der beiden Texturen. Das Ergebnis ist ein Vektor, welcher vom Eintrittspunkt auf den Austrittspunkt des "Blickstrahls" zeigt. Nun wird mit dieser Information im PixelShader in bestimmten Abständen die Dichte mit den dazugehörigen Farbwerten bestimmt. Diese Farbwerte (RGBA) werden kontinuierlich aufaddiert und die Schleife bricht ab, wenn alpha den Wert 1.0f bzw. 255 übersteigt.


Diese Technik ist mit Abstand die leistungsintensivste, da pro Pixel viele TexturLookups durchgeführt werden müssen.

Das Programm

Das Programm bietet eine Hilfefunktion (Taste F1), welche zu den einzelnen Modi Hinweise einblendet. Die Navigation durch das Programm erfolgt auf der linken Seite. Mittels des Datei-Laden-Dialogs können Volumsdaten geladen werden. In allen 3D-Modi kann das Volumsobjekt mittels rechter Maustaste und Mausbewegung rotiert werden.