merged with main branch
parent
ab2e6b4ca7
commit
b8d898b8a5
2
README
2
README
|
@ -188,7 +188,7 @@ Network rendering:
|
||||||
entails installing a suitable "~/.ssh/authorized_keys2" file on the server
|
entails installing a suitable "~/.ssh/authorized_keys2" file on the server
|
||||||
and running "ssh-agent" on the client. On Windows, the situation is a bit
|
and running "ssh-agent" on the client. On Windows, the situation is a bit
|
||||||
more complicated because it does not come with a suitable SSH client by
|
more complicated because it does not come with a suitable SSH client by
|
||||||
default. To get SSH to work, biquaque requires plink.exe (from PUTTY) to
|
default. To get SSH to work, Mitsuba requires plink.exe (from PUTTY) to
|
||||||
be on the $PATH. For passwordless authentication with a Linux/OSX-based
|
be on the $PATH. For passwordless authentication with a Linux/OSX-based
|
||||||
server, convert your private key to PuTTY's format (with the help
|
server, convert your private key to PuTTY's format (with the help
|
||||||
of puttygen.exe). Afterwards, pageant.exe is required to load and
|
of puttygen.exe). Afterwards, pageant.exe is required to load and
|
||||||
|
|
14
SConstruct
14
SConstruct
|
@ -136,8 +136,8 @@ if not conf.CheckCHeader(['stdio.h', 'jpeglib.h']):
|
||||||
if not conf.CheckCXXHeader('ImfRgba.h'):
|
if not conf.CheckCXXHeader('ImfRgba.h'):
|
||||||
print 'OpenEXR is missing (install libopenexr-dev)'
|
print 'OpenEXR is missing (install libopenexr-dev)'
|
||||||
Exit(1)
|
Exit(1)
|
||||||
if not conf.CheckCXXHeader('xercesc/util/PlatformUtils.hpp'):
|
if not conf.CheckCXXHeader('xercesc/dom/DOMLSParser.hpp'):
|
||||||
print 'Xerces-C must be installed (install libxerces-c2-dev)!'
|
print 'Xerces-C++ 3.x must be installed (install libxerces-c-dev)!'
|
||||||
Exit(1)
|
Exit(1)
|
||||||
if not conf.CheckCXXHeader('dae.h'):
|
if not conf.CheckCXXHeader('dae.h'):
|
||||||
hasCollada = False
|
hasCollada = False
|
||||||
|
@ -379,6 +379,7 @@ shandler = mainEnv.StaticObject('src/mitsuba/shandler.cpp')
|
||||||
# Build the command-line+GUI interface
|
# Build the command-line+GUI interface
|
||||||
mainEnv.Program('mtssrv', resources + ['src/mitsuba/mtssrv.cpp'])
|
mainEnv.Program('mtssrv', resources + ['src/mitsuba/mtssrv.cpp'])
|
||||||
mainEnv.Program('mitsuba', resources + ['src/mitsuba/mitsuba.cpp', shandler])
|
mainEnv.Program('mitsuba', resources + ['src/mitsuba/mitsuba.cpp', shandler])
|
||||||
|
mainEnv.Program('mtsutil', resources + ['src/mitsuba/mtsutil.cpp', shandler])
|
||||||
|
|
||||||
if sys.platform == 'darwin':
|
if sys.platform == 'darwin':
|
||||||
mainEnv_osx = mainEnv.Clone();
|
mainEnv_osx = mainEnv.Clone();
|
||||||
|
@ -389,7 +390,6 @@ if sys.platform == 'darwin':
|
||||||
|
|
||||||
env.Program('src/utils/utils_test', ['src/utils/utils_test.cpp'])
|
env.Program('src/utils/utils_test', ['src/utils/utils_test.cpp'])
|
||||||
env.Program('src/utils/joinrgb', ['src/utils/joinrgb.cpp'])
|
env.Program('src/utils/joinrgb', ['src/utils/joinrgb.cpp'])
|
||||||
env.Program('src/utils/addimages', ['src/utils/addimages.cpp'])
|
|
||||||
env.Program('src/utils/ssalbedo', ['src/utils/ssalbedo.cpp'])
|
env.Program('src/utils/ssalbedo', ['src/utils/ssalbedo.cpp'])
|
||||||
env.Program('src/utils/dumpimage', ['src/utils/dumpimage.cpp'])
|
env.Program('src/utils/dumpimage', ['src/utils/dumpimage.cpp'])
|
||||||
env.Program('src/utils/ttest', ['src/utils/ttest.cpp'])
|
env.Program('src/utils/ttest', ['src/utils/ttest.cpp'])
|
||||||
|
@ -458,7 +458,10 @@ if hasQt:
|
||||||
|
|
||||||
plugins = []
|
plugins = []
|
||||||
|
|
||||||
# Build the plugins -- BSDFs
|
# Build the plugins -- Utilities
|
||||||
|
plugins += env.SharedLibrary('plugins/addimages', ['src/utils/addimages.cpp'])
|
||||||
|
|
||||||
|
# BSDFs
|
||||||
plugins += env.SharedLibrary('plugins/lambertian', ['src/bsdfs/lambertian.cpp'])
|
plugins += env.SharedLibrary('plugins/lambertian', ['src/bsdfs/lambertian.cpp'])
|
||||||
plugins += env.SharedLibrary('plugins/dielectric', ['src/bsdfs/dielectric.cpp'])
|
plugins += env.SharedLibrary('plugins/dielectric', ['src/bsdfs/dielectric.cpp'])
|
||||||
plugins += env.SharedLibrary('plugins/mirror', ['src/bsdfs/mirror.cpp'])
|
plugins += env.SharedLibrary('plugins/mirror', ['src/bsdfs/mirror.cpp'])
|
||||||
|
@ -470,6 +473,7 @@ plugins += env.SharedLibrary('plugins/roughglass', ['src/bsdfs/roughglass.cpp'])
|
||||||
plugins += env.SharedLibrary('plugins/roughmetal', ['src/bsdfs/roughmetal.cpp'])
|
plugins += env.SharedLibrary('plugins/roughmetal', ['src/bsdfs/roughmetal.cpp'])
|
||||||
plugins += env.SharedLibrary('plugins/composite', ['src/bsdfs/composite.cpp'])
|
plugins += env.SharedLibrary('plugins/composite', ['src/bsdfs/composite.cpp'])
|
||||||
|
|
||||||
|
|
||||||
# Phase functions
|
# Phase functions
|
||||||
plugins += env.SharedLibrary('plugins/isotropic', ['src/phase/isotropic.cpp'])
|
plugins += env.SharedLibrary('plugins/isotropic', ['src/phase/isotropic.cpp'])
|
||||||
plugins += env.SharedLibrary('plugins/hg', ['src/phase/hg.cpp'])
|
plugins += env.SharedLibrary('plugins/hg', ['src/phase/hg.cpp'])
|
||||||
|
@ -610,6 +614,7 @@ if sys.platform == 'win32':
|
||||||
dllprefix='tools/windows/lib32/'
|
dllprefix='tools/windows/lib32/'
|
||||||
installTargets += env.Install('dist', 'mitsuba.exe')
|
installTargets += env.Install('dist', 'mitsuba.exe')
|
||||||
installTargets += env.Install('dist', 'mtssrv.exe')
|
installTargets += env.Install('dist', 'mtssrv.exe')
|
||||||
|
installTargets += env.Install('dist', 'mtsutil.exe')
|
||||||
installTargets += env.Install('dist', 'mtsimport.exe')
|
installTargets += env.Install('dist', 'mtsimport.exe')
|
||||||
installTargets += env.Install('dist', 'mtsgui.exe')
|
installTargets += env.Install('dist', 'mtsgui.exe')
|
||||||
installTargets += env.Install('dist', 'src/libcore/libcore.dll')
|
installTargets += env.Install('dist', 'src/libcore/libcore.dll')
|
||||||
|
@ -649,6 +654,7 @@ elif sys.platform == 'darwin':
|
||||||
installTargets += env.Install('Mitsuba.app/plugins', i)
|
installTargets += env.Install('Mitsuba.app/plugins', i)
|
||||||
installTargets += env.Install('Mitsuba.app/schema', 'schema/scene.xsd')
|
installTargets += env.Install('Mitsuba.app/schema', 'schema/scene.xsd')
|
||||||
installTargets += env.Install('Mitsuba.app/Contents/MacOS', 'mtssrv')
|
installTargets += env.Install('Mitsuba.app/Contents/MacOS', 'mtssrv')
|
||||||
|
installTargets += env.Install('Mitsuba.app/Contents/MacOS', 'mtsutil')
|
||||||
installTargets += env.Install('Mitsuba.app/Contents/MacOS', 'mitsuba')
|
installTargets += env.Install('Mitsuba.app/Contents/MacOS', 'mitsuba')
|
||||||
installTargets += env.Install('Mitsuba.app/Contents/MacOS', 'mtsimport')
|
installTargets += env.Install('Mitsuba.app/Contents/MacOS', 'mtsimport')
|
||||||
plist = env.Install('Mitsuba.app/Contents', 'tools/darwin/Info.plist')
|
plist = env.Install('Mitsuba.app/Contents', 'tools/darwin/Info.plist')
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
main.pdf: main.tex introduction.tex compiling.tex basics.tex format.tex integrator.tex acknowledgements.tex
|
main.pdf: main.tex introduction.tex compiling.tex basics.tex format.tex import.tex integrator.tex parallelization.tex acknowledgements.tex
|
||||||
pdflatex main.tex
|
pdflatex main.tex
|
||||||
|
|
|
@ -8,6 +8,7 @@ To launch the interactive frontend, run \code{Mitsuba.app} on MacOS,
|
||||||
You can also drag and drop scene files onto the application icon or the running program to open them.
|
You can also drag and drop scene files onto the application icon or the running program to open them.
|
||||||
A quick video tutorial on using the GUI can be found here: \url{http://vimeo.com/13480342}.
|
A quick video tutorial on using the GUI can be found here: \url{http://vimeo.com/13480342}.
|
||||||
\subsection{Command line interface}
|
\subsection{Command line interface}
|
||||||
|
\label{sec:mitsuba}
|
||||||
The \texttt{mitsuba} binary is an alternative non-interactive rendering
|
The \texttt{mitsuba} binary is an alternative non-interactive rendering
|
||||||
frontend for command-line use and batch job operation.
|
frontend for command-line use and batch job operation.
|
||||||
To get a listing of the parameters it supports, run
|
To get a listing of the parameters it supports, run
|
||||||
|
@ -186,3 +187,52 @@ Options/Arguments:
|
||||||
|
|
||||||
The README file included with the distribution contains further information.
|
The README file included with the distribution contains further information.
|
||||||
\end{console}
|
\end{console}
|
||||||
|
\subsection{Direct connection server}
|
||||||
|
A Mitsuba compute node can be created using the \code{mtssrv} executable. By default,
|
||||||
|
it will listen on port 7554:
|
||||||
|
\begin{shell}
|
||||||
|
$\texttt{\$}$ mtssrv
|
||||||
|
..
|
||||||
|
maxwell: Listening on port 7554.. Send Ctrl-C or SIGTERM to stop.
|
||||||
|
\end{shell}
|
||||||
|
Type \code{mtssrv -h} to see a list of available options.
|
||||||
|
If you find yourself unable to connect to the server, \code{mtssrv} is probably listening on
|
||||||
|
the wrong interface. In this case, please specify an explicit IP address or hostname:
|
||||||
|
\begin{shell}
|
||||||
|
$\texttt{\$}$ mtssrv -i maxwell.cs.cornell.edu
|
||||||
|
\end{shell}
|
||||||
|
As advised in Section~\ref{sec:mitsuba}, it is advised to run \code{mtssrv} \emph{only} in trusted networks.
|
||||||
|
|
||||||
|
One nice feature of \code{mtssrv} is that it (like \code{mitsuba}) also supports the \code{-c} and \code{-s}
|
||||||
|
parameters, which can be used to connect to additional compute servers.
|
||||||
|
This allows building large hierarchies of nodes,
|
||||||
|
where communication occurs only amongst neighbors and the root node presents itself as
|
||||||
|
a computer with hundreds of cores.
|
||||||
|
Connecting clients will not be able to distinguish additional cores obtained in this manner
|
||||||
|
from the actual server cores.
|
||||||
|
|
||||||
|
Such hierarchies are mainly useful to reduce communication bottlenecks when distributing
|
||||||
|
large resources (such as scenes) to remote machines. Imagine the following hypothetical scenario:
|
||||||
|
you would like to render a 50MB-sized scene while at home, but rendering is too slow.
|
||||||
|
You decide to tap into some extra machines available
|
||||||
|
at your workplace, but this usually doesn't make things much faster because of the relatively slow broadband
|
||||||
|
connection and the need to transmit your scene to every single compute node involved.
|
||||||
|
|
||||||
|
Using \code{mtssrv}, you can
|
||||||
|
instead designate a central scheduling node at your workplace, which accepts connections and delegates
|
||||||
|
rendering tasks to the other machines. In this case, you will only have to transmit the scene once,
|
||||||
|
and the remaining distribution happens over the comparatively fast ethernet at your workplace.
|
||||||
|
\subsection{Utility launcher}
|
||||||
|
\label{sec:mtsutil}
|
||||||
|
When working on a larger project, one often needs to implement various utility programs that
|
||||||
|
perform simple tasks, such as applying a filter to an image or processing
|
||||||
|
a matrix stored in a file. In a framework like Mitsuba, this unfortunately involves
|
||||||
|
a significant coding overhead in initializing the necessary APIs on all supported platforms.
|
||||||
|
To reduce this tedious work on the side of the programmer, Mitsuba comes with a utility launcher
|
||||||
|
called \code{mtsutil}.
|
||||||
|
|
||||||
|
The general usage of this command is
|
||||||
|
\begin{shell}
|
||||||
|
$\texttt{\$}$ mtsutil [options] <utility name> [arguments]
|
||||||
|
\end{shell}
|
||||||
|
For a listing of all supported options and utilities, enter the command without parameters.
|
||||||
|
|
|
@ -112,6 +112,7 @@
|
||||||
\include{basics}
|
\include{basics}
|
||||||
\include{format}
|
\include{format}
|
||||||
\include{plugins}
|
\include{plugins}
|
||||||
|
\include{import}
|
||||||
\include{integrator}
|
\include{integrator}
|
||||||
\include{parallelization}
|
\include{parallelization}
|
||||||
\include{acknowledgements}
|
\include{acknowledgements}
|
||||||
|
|
|
@ -1,2 +1,27 @@
|
||||||
\section{Parallelization layer}
|
\section{Parallelization layer}
|
||||||
TBD
|
Mitsuba is built on top of a flexible parallelization layer, which can spread out
|
||||||
|
various types of computation over local and remote cores.
|
||||||
|
The guiding principle is that if an operation can potentially take longer than a
|
||||||
|
few seconds, it ought to use all the cores it can get.
|
||||||
|
|
||||||
|
Here, we will go through a simple example, which will hopefully provide sufficient intuition
|
||||||
|
to realize more complex tasks.
|
||||||
|
To obtain good (i.e. close to linear) speedups, the parallelization layer depends on
|
||||||
|
several key assumptions of the task to be parallelized:
|
||||||
|
\begin{itemize}
|
||||||
|
\item The task can easily be split up into a discrete number of work units, which requires a negligible amount of computation.
|
||||||
|
\item Each work unit is small in footprint so that it can easily be transferred over the network or shared memory.
|
||||||
|
\item A work unit constitutes a significant amount of computation, which by far outweighs the cost of transmitting it to another node.
|
||||||
|
\item The `work result' obtained by processing a work unit is again small in footprint, so that it can easily be transferred back.
|
||||||
|
\item Merging all `work results' to a solution of the whole problem requires a negligible amount of additional computation.
|
||||||
|
\end{itemize}
|
||||||
|
This essentially corresponds to a parallel version of \emph{Map} (as in \emph{Map\&Reduce}), which is very
|
||||||
|
well-suited for many rendering workloads.
|
||||||
|
|
||||||
|
The example we consider here computes a \code{ROT13} ``encryption'' of a string, which
|
||||||
|
most certainly violates the `significant amount of computation' assumption. Nevertheless,
|
||||||
|
the inherent parallelism and simplicity of this task make it a good example.
|
||||||
|
|
||||||
|
All of the relevant interfaces are contained in \code{include/mitsuba/core/sched.h}.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -74,7 +74,7 @@ public:
|
||||||
* Should only be called if the intersected
|
* Should only be called if the intersected
|
||||||
* shape does indeed have a subsurface integrator!
|
* shape does indeed have a subsurface integrator!
|
||||||
*/
|
*/
|
||||||
inline Spectrum LoSub(const Vector &d) const;
|
inline Spectrum LoSub(const Scene *scene, const Vector &d) const;
|
||||||
|
|
||||||
/// Computes texture coordinate partials
|
/// Computes texture coordinate partials
|
||||||
void computePartials(const RayDifferential &ray);
|
void computePartials(const RayDifferential &ray);
|
||||||
|
|
|
@ -15,8 +15,8 @@ inline Spectrum Intersection::Le(const Vector &d) const {
|
||||||
LuminaireSamplingRecord(*this, d));
|
LuminaireSamplingRecord(*this, d));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Spectrum Intersection::LoSub(const Vector &d) const {
|
inline Spectrum Intersection::LoSub(const Scene *scene, const Vector &d) const {
|
||||||
return shape->getSubsurface()->Lo(*this, d);
|
return shape->getSubsurface()->Lo(scene, *this, d);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const BSDF *Intersection::getBSDF(const RayDifferential &ray) {
|
inline const BSDF *Intersection::getBSDF(const RayDifferential &ray) {
|
||||||
|
|
|
@ -28,14 +28,7 @@ public:
|
||||||
inline const std::vector<Shape *> getShapes() const { return m_shapes; }
|
inline const std::vector<Shape *> getShapes() const { return m_shapes; }
|
||||||
|
|
||||||
/// Get the exitant radiance for a point on the surface
|
/// Get the exitant radiance for a point on the surface
|
||||||
virtual Spectrum Lo(const Intersection &its,
|
virtual Spectrum Lo(const Scene *scene, const Intersection &its, const Vector &d) const = 0;
|
||||||
const Vector &d) const = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Query the the readiance function inside the object. Requires a surface
|
|
||||||
* normal used to create a slab approximation
|
|
||||||
*/
|
|
||||||
virtual Spectrum Li(const Ray &ray, const Normal &n) const = 0;
|
|
||||||
|
|
||||||
/// Serialize this subsurface integrator to a binary data stream
|
/// Serialize this subsurface integrator to a binary data stream
|
||||||
void serialize(Stream *stream, InstanceManager *manager) const;
|
void serialize(Stream *stream, InstanceManager *manager) const;
|
||||||
|
|
|
@ -260,7 +260,7 @@ public:
|
||||||
|
|
||||||
std::string toString() const {
|
std::string toString() const {
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << "Microfacet["
|
oss << "Microfacet[" << endl
|
||||||
<< " diffuseReflectance = " << indent(m_diffuseReflectance->toString()) << "," << endl
|
<< " diffuseReflectance = " << indent(m_diffuseReflectance->toString()) << "," << endl
|
||||||
<< " specularReflectance = " << indent(m_specularReflectance->toString()) << "," << endl
|
<< " specularReflectance = " << indent(m_specularReflectance->toString()) << "," << endl
|
||||||
<< " intIOR = " << m_intIOR << "," << endl
|
<< " intIOR = " << m_intIOR << "," << endl
|
||||||
|
|
Loading…
Reference in New Issue