Coder Social home page Coder Social logo

chen0123bin / unityvolumerendering Goto Github PK

View Code? Open in Web Editor NEW

This project forked from mlavik1/unityvolumerendering

0.0 0.0 0.0 43.87 MB

Volume rendering, implemented in Unity3D. Want to support my project? Donate some money to Red Cross and send me a screenshot/message/issue, and I'll be greatly motivated! :) Any amount is welcome!

Home Page: https://fosstodon.org/web/accounts/106931417271268077

License: MIT License

Python 0.52% C# 86.72% HLSL 1.88% ShaderLab 10.89%

unityvolumerendering's Introduction

UnityVolumeRendering

A volume renderer, made in Unity3D. I have written a tutorial explaining the basic implementation. Have any questions? Create an issue or contact me on Mastodon.

I also have a tutorial video that shows how to use the project

alt tag

Requirements:

  • Unity 2018 1.5 or newer (should also work with some older versions, but I haven't tested)

How to use sample scene

  • Open "TestScene.unity"
  • Click "Volume Rendering" in the menu bar
  • Select "Load Asset"
  • Pick a file in the "DataFiles" folder (I recommend vismale.dat)
  • Click the "import"-button

Step-by-step instructions

1. Import model

Raw datasets:

In the menu bar, click "Volume Rendering" and "Load raw dataset"

Then select the dataset you wish to import. Currently only raw datasets are supported (you can add your own importer for other datasets).

In the next menu you can optionally set the import setting for the raw dataset. For the sample files you don't need to change anything.

DICOM:

To import a DICOM dataset, click "Volume Rendering" and "Load DICOM" and select the folder containing your DICOM files. The dataset must be of 3D nature, and contain several files - each being a slice along the Z axis.

2. Moving the model

You can move the model like any other GameObject. Simply select it in the scene view or scene hierarchy, and move/rotate it like normal.

3. Changing the visualisation

Select the model and find the "Volume Render Object" in the inspector.

Here you can change the "Render mode":

Example:

There are 3 render modes:

  • Direct Volume Rendering (using transfer functions)
  • Maximum Intensity Projection (shows the maximum density)
  • Isosurface Rendering

Direct Volume Rendering

Direct volume rendering is the most standard rendering mode. It sends rays through the dataset, and uses "transfer functions" (1D or 2D) to determine the colour and opacity. Transfer functions map density (2D: also gradient magnitude) to a colour and opacity.

  • Modifying transfer functions: Click "Volume Rendering" in the menu bar and select "1D Transfer Function" or "2D Transfer Function"
    • 1D Transfer Function: X-axis represents density and Y-axis represents alpha (opaccity). Move the grey alpha knots to create a curve for opacity by density. Right-click to add new alpha knots. The bottom gradient-coloured panel maps colour to density. Right-click to add new knots and click on an existing colour knot to modify its colour.
    • 2D Transfer Function: X-axis represents density and Y-axis represents gradient magnitude. Click "add rectangle" to add a new rectangle-shape. Move the four sliders (bottom left) to modify size/position. Modify the two sliders to the right to change min/max alpha/opacity. Each rectangle can have one colour (see colour picker).

Isosurface Rendering

Isosurface rendering draws the first thing the ray hits, with a density higher than some threshold. You can set this threshold yourself, by selecting the object and changing the "Visible value range" in the inspector. These can also be used with direct volume rendering mode.

(VR) performance

Since VR requires two cameras to render each frame, you can expect worse performance. However, you can improve the FPS in two ways:

  • Open DirectVolumeRenderingShader.shader and reduce the value of NUM_STEPS inthe frag_dvr function. This will sacrifice quality for performance.
  • Disable the DEPTHWRITE_ON shader variant. You can do this from code, or just remove the line "#pragma multi_compile DEPTHWRITE_ON DEPTHWRITE_OFF" in DirectVolumeRenderingShader.shader. Note: this will remove depth writing, so you won't be able to intersect multiple datasets.

How to use in your own project

  • Create an instance of an importer (Directly, or indirectly using the ImporterFactory):
    IImageFileImporter importer = ImporterFactory.CreateImageFileImporter(ImageFileFormat.NRRD); (alternatively, use the DICOMImporter)
  • Call the Import()-function, which returns a Dataset:
    VolumeDataset dataset = importer.Import(file);
  • Use VolumeObjectFactory to create an object from the dataset:
    VolumeRenderedObject obj = VolumeObjectFactory.CreateObject(dataset);

See the importer documentation for more detailed information.

alt tag alt tag alt tag alt tag alt tag alt tag alt tag

Contributing

See CONTRIBUTING.md for how to contribute.

Thanks to everyone who have contributed so far.

See ACKNOWLEDGEMENTS.txt for libraries used by this project.

unityvolumerendering's People

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.