Notifications
Article
Unity® Volume Rendering
Updated 5 months ago
1.7 K
10
In der ärztlichen Diagnose und Therapie kommen heute computergestützte Verfahren zur Anwendung. Mit Schnittbildverfahren wie CT oder MRI werden medizinische Bilddaten akquiriert. Diese können als Volumengrafik in AR/VR Serious Games auch der Wissensbildung dienen.

Konzept

Das Konzept sieht vor, für Unity3D ein Plug-in zum Rendern von Volumengrafiken zu implementieren. Mit dem Plug-in soll eine Region of Interest festgelegt werden können. Die Farbgebung soll mit einer editierbaren Transferfunktion erfolgen. Die Volumengrafik soll mit einer Sichtstrahlmethode, dem Raycasting berechnet werden. Die Rechenkapazität der Grafikprozessoren soll genutzt werden, indem das Rendern mit Shader-Programmen erfolgt.

Design

Mit dem Plug-in kann ein Game-Object "Volume" erstellt werden. Es enthält die Komponenten Bounding-Box und Volume-Manager. Dem Game-Object wird im Scenegraph des Hierarchy Window ein weiteres Game-Object mit einem Kubus-Mesh untergeordnet. Somit kann der zu rendernde Bereich als "Region of Interest" editiert werden.
Im Mesh-Renderer der ROI wird ein Material zugewiesen. Als Shader kann die Rendermethode "Volume Raycaster" gewählt werden. Dessen Shader-GUI erhält als Parameter eine 3D-Textur. Die Farbgebung und Transparenz erfolgt über eine Transferfunktion.

Umsetzung

Aus CT/MRI-Daten im DICOM-Format können unter Verwendung von eigens implementierten .NET/C#-Skripten Bilddaten extrahiert und als JPEG oder PNG gespeichert werden.
Aus einem Stapel von Bildern kann eine Rekonstruktion in Form einer 3D-Textur erstellt werden. Diese wird im Material als Parameter angegeben.
Die 3D-Textur kann im Material als Parameter übergeben werden, die Sampling Rate wird mit einem Slider angegeben. Ein Gradient dient zum Editieren der Transferfunktion - eine selbst implementierte Erweiterung des Unity ShaderLab. Somit kann die Farbe und Transparenz in Echtzeit editiert werden.
Als 3D-Modell dient uns der Mesh-Cube der ROI. Ihre TRS-Werte werden als 4x4 Matrize in den Shader geladen. Aus dem Gradienten wird eine 2D-Textur mit 255 RGBA-Werten generiert, die als Transferfunktion dient. Zum Rendern wurde ein "Volume Raycaster" implementiert: Ein Pixel-Shader in Cg/HLSL, der 2D-Texturen generiert und ein UV-Mapping auf den Mesh-Cube macht.

Resultat

Für die Entwicklung und das Testing kam als Hardware ein ASUS ROG G56JR zum Einsatz. Der Laptop hat eine NVIDIA-Grafikkarte vom Typ GeForce GTX 760M verbaut. Als Betriebssystem wurde ein Ubuntu 16.04 LTS 64 bit inklusive dem NVIDIA X Server aufgesetzt. Mit dem Rendern auf der dedizierten GPU wird gemäss Unity-5.3 Statistics eine durchschnittliche Rate von 300 Frames pro Sekunde erreicht (Range von 150 bis über 1000 FPS).
2016, Roland Bruggmann, BSc Computer Science.

Roland Bruggmann
BSc CS, Software Engineer - Programmer
1
Comments
Roland Bruggmann
a month ago
BSc CS, Software Engineer - Programmer
Hallo Kaspar! Danke für die Komplimente und Dein Interesse am Projekt. Ich habe mich inzwischen auf dem Unity Asset Store als Publisher registriert (siehe https://assetstore.unity.com/users/5566864 ). Ich hoffe, in Bälde ein Paar Packages publizieren zu können. Darf ich freundlich Fragen, ob Du Student oder berufstätig bist? Stay tuned :) Gruss, Roland
0
KK
Kaspar Kaufmann
a month ago
Hallo Roland! Fantastisches Projekt. Ich habe in einem anderen Thread gelesen, dass du das Projekt nicht öffentlich machen wirst. Gibt es eine Möglichkeit dein Tool auf eine andere Weise zu erwerben? Viele Grüsse, Kaspar
0
KK
Kaspar Kaufmann
a month ago
Hallo Roland
0
Roland Bruggmann
3 months ago
BSc CS, Software Engineer - Programmer
Hi Daniel! Thanks for your interest in my project and your compliments. The reconstruction is done by parsing a stack of Texture2D into a single Texture3D which fits into a cube. Sure: let's keep in touch. Greetings, Roland
0