Notifications
Article
Unity® Volume Rendering
Updated 7 months ago
2.2 K
16
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
25 days ago
BSc CS, Software Engineer - Programmer
Hi Bill, Yes, combining the volume rendering with a 3D Model - that would be really unique and cool. Actually, what I have tested so far is a setup with ROI size 0.2 (~50 slices), Raycasting with 250 samples, Alpha Threshold at 0.9, Rotating Camera: + 300 FPS in Unity Statistics - as seen in this screencast https://www.youtube.com/watch?v=hGCnck1zI-Q Greetings, Roland
0
Bill Blakesley
25 days ago
Neural Impulse Media - Owner
Combining the volume stack with perfectly registered 3D models would really be something unique. What kind of performance are you getting with a reasonable stack?
0
Bill Blakesley
25 days ago
Neural Impulse Media - Owner
Hi Roland,
0
Roland Bruggmann
a month ago
BSc CS, Software Engineer - Programmer
Hi Bill, thanks for your compliments. I hope to be able to publish a package in the coming weeks. Stay tuned :-) Greetings, Roland
0
Bill Blakesley
a month ago
Neural Impulse Media - Owner
this plugin. Any ideas on when you will make it available?
0