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