To achieve real-time performance on affordable hardware, the advantages of explicit surface extraction and representation are unified with the advantages of fast rendering using shear/warp projection. A voxelized surface representation is created during the preprocessing step, and stored in a RenderList for later rendering.
The creation of an explicit surface representation prior to rendering eliminates the need for surface detection during rendering as required by first-hit ray casting. To obtain a representation for the iso-surface, the volume is scanned for transitions between voxels with a value below and above the threshold, i.e., the iso-value. If a voxel has a data value greater or equal to the threshold and if it has at least one 26-connected neighbor below the threshold, it belongs to the surface and is considered to be relevant. The relevant voxels are extracted form the volume and stored into a RenderList / RenderListEntry structure. The voxels which have been extracted during the scan correspond to a 6-connected surface within the volume at the specified threshold value. The 6-connectedness of the surface voxels is required to ensure that no holes appear during shear/warp-based rendering due to displacement of voxels between successive slices.
For each surface voxel, it's position and the gradient vector are
stored as attributes. To obtain a memory-efficient representation,
the gradient vector is converted to polar coordinates
instead of the usual
representation and stored using 14
bits (7 bits per angular coordinate, as a tradeoff between shading quality
and computational effort for precomputing shading).
The storage scheme allows to code 16384 distinct normal
vectors which is sufficient for smooth shading of real-life data.