VolumeViz LDM 8.5 Release Notes


Performance and memory management enhancements

Many improvements have been made to VolumeViz and VolumeViz LDM to optimize the rendering performance, reduce the memory consumption and speed-up the loading of large volumes through the LDM technology. The most significant improvements are:

  • Many memory optimizations to avoid replication of data. These optimizations take advantage of new specialized sub-classes of SoCpuBufferObject (see custom volume reader section below) and the new LDM Tile Cache (see SoLDMGlobalResourceParameters).
    Advantages include:
    • No replication of data when using an in-memory dataset.
    • Compressed tiles in LDM files are kept compressed in memory.
    • Compressed tiles in non-LDM files can be cached (see SoLDMGlobalResourceParameters::TileCacheType).
    • Uniform tiles (all voxels have the same value) are kept in memory as a single value and a single texel.
    • LDM volume readers can return tiles without copying data.
  • Better resource allocation when using multiple volumes or masks, allowing LDM to reach full resolution more quickly.
  • LargeSliceSupport (SoOrthoSlice/SoVolumeSkin) is now asynchronous, maintaining interactivity while loading high resolution data.
  • Subtile optimization support for SoVolumeMask.
  • LDM octree valuation is no longer done in the GLRender action.
    This avoids delaying the rendering of all VolumeViz shapes until the second pass, avoiding render order issues in particular when using multiple transparent objects.
  • Histogram generation during LDM Conversion can be disabled using the "–noHistogram" option.
    Conversion is faster if you don't need this information.
  • SoVolumeSkinhas a new field faceMode that specifies whether the front faces (toward the camera) or back faces will be rendered. As a result volume skin can be rendered using fewer tiles in memory and fewer textures on the GPU, resulting in better performance and more efficient use of memory.

Support of RGBA datasets

RGBA volumes with 8 bits per component stored in a SoDataSet with UNSIGNED_INT32 datum format can now be used as datasets and rendered directly.

  • SoVolumeReader has two new methods isRGBA() and setRGBA().
  • LDM converters have two new methods SoConverterParameters:: setRGBAMode() and SoConverterParameters:: isRGBAMode() with an associated command line option "-rgba".
  • Histogram and min/max computation can be disabled by adding the "–noHistogram" option.
  • In-memory datasets must use the SoVolumeData::setRGBAData() method to tag the data as RGBA.
  • SoDataCompositor has a new field rgbaMode to signal that an RGBA dataset is being processed.

Note that:

  • SoDataRange nodes are ignored in RGBA mode.
  • SoTransferFunction nodes are ignored in RGBA mode.
  • PreIntegration is done on RGBA’s Luminance
  • IsoSurface is done on RGBA’s Luminance

All shaders have been modified to support RGBA. The following #define macros are automatically added to all shaders to support RGBA volumes:
When not in RGBA mode :

#define  VVIZ_DATARGBA    0
#define VVIZ_DATATYPE    float

When in RGBA mode

#define VVIZ _DATARGBA    1
#define VVIZ_DATATYPE    vec4

Two new example programs simpleSliceRGBA and simpleHorizonRGBA show how to use RGBA images.

Bitfield dataset support

Bit valued volumes (each voxel is 0 or 1) are now fully supported and managed in an optimal way. They can be used, for example, to define complex volume masks.

New isosurface rendering

A new isosurface rendering mode has been added for segmented data, for example geobodies in Oil&Gas terminology.
This feature is controlled by a new field called SoVolumeRenderingQuality::segmentedInterpolation.
Note that this rendering mode supports SoInteractiveComplexity.
The new “segmentedInterpolation” example program shows the effect of this rendering technique.

Picking improvements

Picking on an SoVolumeMask now takes into account all the combinations of SoVolumeDataDrawStyle.

Picking on an SoVolumeRender now returns the first non-transparent voxel by default. In other words, when you call SoPickedPoint::getPoint(), it will now return the 3D coordinate of the first non-transparent voxel (i.e. with alpha value greater than zero) intersected by the pick ray. Previously getPoint() returned the point intersected on the face of the volume and it was then necessary to get the SoVolumeRenderDetail object and call the getFirstNonTransparentValue() method explicitly. The previous behavior can be restored using an SoPickStyle node with style set to SoPickStyle::BBOX.

SEGY reader

The SEGY reader now supports XYZ_AS_INLINE_CROSSLINE_SAMPLE for the method SoVRSegyFileReader::setSegyAxisOrder().

Custom LDM volume readers

Custom LDM volume readers (subclasses of SoVolumeReader) can now implement a new version of the readTile() method. This method allows the reader to return an existing tile to VolumeViz without copying the data. It also allows the reader to return one of the new specialized sub-classes of SoCpuBufferObject that use less system memory to store a tile:

  • SoCpuBufferUniform: This buffer contains a "uniform" tile in which all the voxels have the same value. It is stored efficiently as a single value until needed.
  • SoCpuBufferCompressed: This buffer contains a compressed tile. It is stored efficiently in its compressed form until needed.
  • SoCpuBufferBasicProperty: This buffer contains a standard tile, but can also store the tile's min and max data values for use in various optimizations.
  • SoCpuBufferBitset: This contains a bitset tile in which each voxel is a boolean value. It is stored efficiently in a packed form until needed.

LDM Tile Cache

LDM can now store uniform and compressed tiles efficiently in system memory and create the expanded tile on-demand at runtime. This mechanism is also used to avoid duplicating data for in-memory volumes. These created tiles are considered temporary and are stored in the new LDM Tile Cache. This cache is separate from, and in addition to, the LDM main memory. Applications should be aware of this additional memory and may want to manage the size.
See SoLdmGlobalResourceParameters for more information.

Picking

Picking on an SoVolumeRender now returns the first non-transparent voxel by default. In other words, when you call SoPickedPoint::getPoint(), it will now return the 3D coordinate of the first non-transparent voxel (i.e. with alpha value greater than zero) intersected by the pick ray. Previously getPoint() returned the point intersected on the face of the volume and it was then necessary to get the SoVolumeRenderDetail object and call the getFirstNonTransparentValue() method explicitly.
The previous behavior can be restored using an SoPickStyle node with style set to SoPickStyle::BBOX.

SoVolumeRender

The following fields are now marked deprecated. (They only applied to CPU computed volume lighting.) Applications should always use GPU computed volume lighting, which is very fast and is enabled using the lighting field of SoVolumeRenderingQuality.

  • lighting
  • lightDirection
  • lightIntensity

SoLdmValuationAction

Valuation of the LDM octree is now done separately from the render traversal (SoGLRenderAction), using the new SoLdmValuationAction. This allows both operations to be more efficient. Applications using an Open Inventor viewer class (e.g. SoQtExaminerViewer) or using the SoSceneManager class are not affected by this change, except that C++ applications must respect the following new restriction:

SoVolumeRendering::init() must be called before any viewer or SoSceneManager instance is created.
Generally we recommend calling init() immediately after initializing Open Inventor (e.g. after calling SoQt::init).

SoVolumeReader (custom LDM volume readers)

  • VolumeViz now calls a new version of the readTile method that returns an SoBufferObject.
    A default compatibility implementation of this method is provided in the SoVolumeReader class. The compatibility implementation allocates memory and calls the old version of readTile. However applications are encouraged to implement their own version of the new method. The new method allows the reader to return data to VolumeViz without copying into a buffer allocated by VolumeViz. It also allows the reader to take advantage of the new specialized subclasses of SoCpuBufferObject that allow, for example, uniform and compressed tiles to be stored efficiently in system memory. See SoVolumeReader for more information.
  • Previously LDM volume readers were required to set the isDataConverted member variable to TRUE.
    Starting with version 8.5, LDM volume readers should implement the isDataConverted method and return TRUE.
  • The isDataConverted method is now declared const.
  • The isThreadSafe method is now declared const.