added a bit more documentation

metadata
Wenzel Jakob 2011-08-27 00:16:09 -04:00
parent 2ba07a76fd
commit a2f929a08a
7 changed files with 122 additions and 43 deletions

View File

@ -69,6 +69,8 @@ f.write('\input{section_media}\n')
os.path.walk('../src/medium', traverse, f) os.path.walk('../src/medium', traverse, f)
f.write('\input{section_phase}\n') f.write('\input{section_phase}\n')
os.path.walk('../src/phase', traverse, f) os.path.walk('../src/phase', traverse, f)
f.write('\input{section_volumes}\n')
os.path.walk('../src/volume', traverse, f)
f.write('\input{section_luminaires}\n') f.write('\input{section_luminaires}\n')
os.path.walk('../src/luminaires', traverse, f) os.path.walk('../src/luminaires', traverse, f)
f.write('\input{section_integrators}\n') f.write('\input{section_integrators}\n')

View File

@ -109,7 +109,7 @@
string,transform,ref,rgb,srgb,spectrum,blackbody, string,transform,ref,rgb,srgb,spectrum,blackbody,
medium,camera,film,sampler,integrator,luminaire, medium,camera,film,sampler,integrator,luminaire,
translate,rotate,scale,lookAt,point,vector,matrix, translate,rotate,scale,lookAt,point,vector,matrix,
include,fscat include,fscat,volume
}, },
} }

7
doc/section_volumes.tex Normal file
View File

@ -0,0 +1,7 @@
\newpage
\subsection{Volume data sources}
\label{sec:volumes}
This section covers the different types of volume data sources included with
Mitsuba. These plugins are intended to be used together with the
\pluginref{heterogeneous} medium plugin and provide three-dimensional spatially varying
density, albedo, and orientation fields.

View File

@ -86,10 +86,10 @@ static StatsCounter earlyExits("Heterogeneous volume",
* } * }
* } * }
* *
* This plugin provides a flexible hheterogeneous medium implementation, which * This plugin provides a flexible heterogeneous medium implementation, which
* acquires its data from nested \code{volume} instances. These can be * acquires its data from nested \code{volume} instances. These can be
* constant, use a procedural function, or fetch data from disk, e.g. using a * constant, use a procedural function, or fetch data from disk, e.g. using a
* memory-mapped density grid. * memory-mapped density grid. See \secref{volumes} for details.
* *
* Instead of allowing separate volumes to be provided for the scattering * Instead of allowing separate volumes to be provided for the scattering
* absorption parameters \code{sigmaS} and \code{sigmaA} (as is done in * absorption parameters \code{sigmaS} and \code{sigmaA} (as is done in

View File

@ -21,6 +21,29 @@
MTS_NAMESPACE_BEGIN MTS_NAMESPACE_BEGIN
/*!\plugin{constvolume}{Constant-valued volume data source}
* \parameters{
* \parameter{value}{\Float\Or\Spectrum\Or\Vector}{
* Specifies the value of the volume
* }
* }
*
* This plugin provides a volume data source that is
* constant throughout its domain. Depending on how it is used,
* its value can either be a scalar, a color spectrum,
* or a 3D vector.
*
* \begin{xml}[caption={Definition of a heterogeneous medium with constant albedo}]
* <medium type="heterogeneous">
* <volume type="constvolume" name="albedo">
* <rgb name="value" value="0.9 0.9 0.7"/>
* </volume>
*
* <!-- .... remaining parameters for
* the 'heterogeneous' plugin -->
* </medium>
* \end{xml}
*/
class ConstantDataSource : public VolumeDataSource { class ConstantDataSource : public VolumeDataSource {
public: public:
ConstantDataSource(const Properties &props) ConstantDataSource(const Properties &props)

View File

@ -34,49 +34,69 @@
MTS_NAMESPACE_BEGIN MTS_NAMESPACE_BEGIN
/** /*!\plugin{gridvolume}{Grid-based volume data source}
* \brief This class implements access to volume data stored on a * \parameters{
* \parameter{filename}{\String}{
* Specifies the filename of the volume data file to be loaded
* }
* \parameter{sendData}{\Boolean}{
* When this parameter is set to \code{true}, the implementation will
* send all volume data to other network render nodes. Otherwise, they
* are expected to have access to an identical volume data file that can be
* mapped into memory. \default{\code{false}}
* }
* \parameter{toWorld}{\Transform}{
* Optional linear transformation that should be applied to the data
* }
* \parameter{min, max}{\Point}{
* Optional parameter that can be used to re-scale the data so that
* it lies in the bounding box between \code{min} and \code{max}.
* }
* }
*
* This class implements access to memory-mapped volume data stored on a
* 3D grid using a simple binary exchange format. * 3D grid using a simple binary exchange format.
* The format uses a little endian encoding and is specified as
* follows:\vspace{3mm}
* *
* The format uses a little endian encoding and is specified as follows: * \begin{center}
* * \begin{tabular}{>{\bfseries}p{2cm}p{11cm}}
* Bytes 1-3 : ASCII Bytes 'V', 'O', and 'L' * \toprule
* Byte 4 : Version identifier (currently 3) * Position & Content\\
* Bytes 5-8 : Encoding identifier using a double word * \midrule
* * Bytes 1-3& ASCII Bytes '\code{V}', '\code{O}', and '\code{L}' \\
* 1 => Dense float32-based representation * Byte 4& File format version number (currently 3)\\
* * Bytes 5-8& Encoding identifier using a 32-bit integer
* 2 => Dense float16-based representation * \begin{enumerate}[(i)]
* NOT YET SUPPORTED BY THIS IMPLEMENTATION * \item Dense \code{float32}-based representation
* * \item Dense \code{float16}-based representation (\emph{currently not supported by this implementation})
* 3 => Dense uint8-based representation * \item Dense \code{uint8}-based representation (The range 0..255 will be mapped to 0..1)
* The range 0..255 will be mapped to 0..1. * \item Dense quantized directions. The directions are stored in spherical
* * coordinates with a total storage cost of 16 bit per entry.
* 4 => Dense quantized directions * \end{enumerate}\\
* The directions are stored in spherical coordinates, * Bytes 9-12 & Number of cells along the X axis (32 bit integer)\\
* with a total storage cost of 16 bit per entry. * Bytes 13-16 & Number of cells along the Y axis (32 bit integer)\\
* * Bytes 17-20 & Number of cells along the Z axis (32 bit integer)\\
* Bytes 9-12 : Number of cells along the X axis (double word) * Bytes 21-24 & Number of channels (32 bit integer, supported values: 1 or 3)\\
* Bytes 13-16 : Number of cells along the Y axis (double word) * Bytes 25-48 & Axis-aligned bounding box of the data stored in single
* Bytes 17-20 : Number of cells along the Z axis (double word) * precision (order: xmin, ymin, zmin, xmax, ymax, zmax)\\
* Bytes 21-24 : Number of channels (double word, supported values: 1 or 3) * Bytes 49-* & Binary data of the volume stored in the specified encoding.
* Bytes 25-48 : Axis-aligned bounding box of the data stored in single
* precision (order: xmin, ymin, zmin, xmax, ymax, zmax)
* Bytes 49-* : Binary data of the volume stored in the specified encoding.
* The data are ordered so that the following C-style indexing * The data are ordered so that the following C-style indexing
* operation makes sense after the file has been mapped into memory: * operation makes sense after the file has been mapped into memory:\newline
* "data[((zpos*yres + ypos)*xres + xpos)*channels + chan]" * \ \ \code{data[((zpos*yres + ypos)*xres + xpos)*channels + chan]}\newline
* where (xpos, ypos, zpos, chan) denotes the lookup location. * where \code{(xpos, ypos, zpos, chan)} denotes the lookup location.\\
*
* \bottomrule
* \end{tabular}
* \end{center}
* *
* Note that Mitsuba expects that entries in direction volumes are either * Note that Mitsuba expects that entries in direction volumes are either
* zero or valid unit vectors. * zero or valid unit vectors.
* *
* When using this data source to represent floating point density volumes, * When using this data source to represent floating point density volumes,
* please ensure that the values are all normalized to lie in the * please ensure that the values are all normalized to lie in the
* range [0, 1] -- otherwise, the Woocock-Tracking integration method in * range $[0, 1]$---otherwise, the Woocock-Tracking integration method in
* heterogeneous.cpp will produce incorrect results. You can use * \pluginref{heterogeneous} will produce incorrect results.
* the 'densityMultiplier' parameter of that class to re-scale the
* densities if neccessary.
*/ */
class GridDataSource : public VolumeDataSource { class GridDataSource : public VolumeDataSource {
public: public:

View File

@ -43,10 +43,37 @@ struct Vector3iKeyOrder : public std::binary_function<Vector3i, Vector3i, bool>
} }
}; };
/** /*!\plugin{volcache}{Caching volume data source}
* This class sits in between the renderer and another data source, for which * \parameters{
* it caches all data lookups using a LRU scheme. This is useful if the nested * \parameter{blockSize}{\Integer}{
* volume data source is expensive to evaluate. * Size of the individual cache blocks
* \default{8, i.e. $8\times8\times 8$}
* }
* \parameter{voxelWidth}{\Float}{
* Width of a voxel (in a cache block) expressed in
* world-space units. \default{automatic}
* }
* \parameter{memoryLimit}{\Integer}{
* Max. allowed memory usage in MiB. \default{1024, i.e. 1 GiB}
* }
* \parameter{toWorld}{\Transform}{
* Optional linear transformation that should be applied to the data
* }
* \parameter{\Unnamed}{\Volume}{
* A nested volume data source
* }
* }
*
* This plugin can be added between the renderer and another
* data source, for which it caches all data lookups using a
* LRU scheme. This is useful when the nested volume data source
* is expensive to evaluate.
*
* The cache works by performing on-demand rasterization of subregions
* of the nested volume into blocks ($8\times 8 \times 8$ by default).
* These are kept in memory until a user-specifiable threshold is exeeded,
* after which point a \emph{least recently used} (LRU) policy removes
* records that haven't been accessed in a long time.
*/ */
class CachingDataSource : public VolumeDataSource { class CachingDataSource : public VolumeDataSource {
public: public:
@ -55,7 +82,7 @@ public:
CachingDataSource(const Properties &props) CachingDataSource(const Properties &props)
: VolumeDataSource(props) { : VolumeDataSource(props) {
/// Size of an individual block (must be a power of 2) /// Size of an individual block (must be a power of 2)
m_blockSize = props.getInteger("blockSize", 4); m_blockSize = props.getInteger("blockSize", 8);
if (!isPowerOfTwo(m_blockSize)) if (!isPowerOfTwo(m_blockSize))
Log(EError, "Block size must be a power of two!"); Log(EError, "Block size must be a power of two!");
@ -65,7 +92,7 @@ public:
m_voxelWidth = props.getFloat("voxelWidth", -1); m_voxelWidth = props.getFloat("voxelWidth", -1);
/* Permissible memory usage in MiB. Default: 1GiB */ /* Permissible memory usage in MiB. Default: 1GiB */
m_memoryLimit = (size_t) props.getLong("memoryLimit", 32) * 1024 * 1024; m_memoryLimit = (size_t) props.getLong("memoryLimit", 1024) * 1024 * 1024;
m_stepSizeMultiplier = (Float) props.getFloat("stepSizeMultiplier", 1.0f); m_stepSizeMultiplier = (Float) props.getFloat("stepSizeMultiplier", 1.0f);