NAME
vpVolumeNormals - compute surface normal vectors and gradient
magnitudes for a volume
SYNOPSIS
#include <volpack.h>
vpResult
vpVolumeNormals(vpc, scalar_data, length, scalar_field, grad_field,
norm_field)
vpContext *vpc;
unsigned char *scalar_data;
int length;
int scalar_field;
int grad_field;
int norm_field;
ARGUMENTS
vpc VolPack context from vpCreateContext.
scalar_data
3D array of scalar samples.
length Size of scalar_data array in bytes.
scalar_field
Voxel field number indicating the field in which to store the
scalar samples.
grad_field
Voxel field number indicating the field in which to store the
gradient magnitudes of the scalar samples.
norm_field
Voxel field number indicating the field in which to store
encoded surface normal vectors.
DESCRIPTION
vpVolumeNormals is used to precompute values for voxel fields used in
classification and shading algorithms. The input is a 3D array of
scalar values; a separate routine is provided for processing scanlines
of voxel data (see vpScanlineNormals(3)). For each voxel, the routine
computes an approximation for the gradient of the scalar field (using a
central-difference operator). From this vector the routine can compute
the magnitude of the gradient, which is useful for some classification
schemes (see vpSetClassifierTable(3)), and a surface normal vector in
the direction of the gradient vector, which is used to implement
lighting models (see vpShadeTable(3)). The scalar value, gradient
magnitude and surface normal vector are then stored into the fields of
the voxel array, which is separate from the array of scalar values.
The scalar array must be an array of 8-bit values (other sizes are not
currently supported). The dimensions of the array must match the
volume dimensions previously specified with vpSetVolumeSize. The size
argument is used to make sure the array has the correct size. The
voxel array must also be initialized by calling vpSetRawVoxels prior to
calling vpVolumeNormals.
The three voxel field number arguments indicate which voxel fields the
computed information should be stored into, and which field the scalar
samples should be copied to. The field numbers must correspond to
appropriately-sized voxel fields previously specified with
vpSetVoxelField. Any of these arguments can be the constant
VP_SKIP_FIELD, in which case the corresponding quantity is not computed
or copied. The voxel fields for the scalar value and the gradient
magnitude must be one-byte fields, and the field for the surface normal
vector must be a two-byte field. The constants VP_SCALAR_MAX,
VP_GRAD_MAX and VP_NORM_MAX give the maximum value that might be stored
in each field, respectively. The value stored in the surface normal
vector field is actually an encoded surface normal; see
vpNormalIndex(3).
ERRORS
The normal return value is VP_OK. The following error return values
are possible:
VPERROR_BAD_SIZE
The size of the scalar array does not match the volume
dimensions.
VPERROR_BAD_VALUE
One or more of the voxel fields specified is invalid, or the
corresponding voxel field has the wrong size.
VPERROR_BAD_VOXEL
The voxel size or the voxel fields have not been specified or
have been incorrectly specified.
VPERROR_BAD_VOLUME
The volume array or volume dimensions have not been specified,
or the size of the volume array does not match the volume
dimensions.
SEE ALSO
VolPack(3), vpCreateContext(3), vpNormalIndex(3), vpScanlineNormals(3),
vpSetClassifierTable(3), vpSetLookupShader(3)