From d2f1d31aebf4096a717cefcad012eedc2126cddc Mon Sep 17 00:00:00 2001 From: Wenzel Jakob Date: Fri, 8 Jul 2011 00:36:02 +0200 Subject: [PATCH] cleanups, yet another bugfix for the A-S model --- doc/gendoc.py | 16 ++++++++- doc/macros.sty | 1 + src/bsdfs/conductor.cpp | 12 ++++--- src/bsdfs/dielectric.cpp | 12 +++---- src/bsdfs/diffuse.cpp | 11 +++--- src/bsdfs/microfacet.h | 5 +++ src/bsdfs/roughconductor.cpp | 3 +- src/bsdfs/roughdielectric.cpp | 63 ++++++++++++++++++++--------------- src/libcore/statistics.cpp | 3 +- 9 files changed, 80 insertions(+), 46 deletions(-) diff --git a/doc/gendoc.py b/doc/gendoc.py index 6e6f07b7..1be81ab0 100755 --- a/doc/gendoc.py +++ b/doc/gendoc.py @@ -6,6 +6,14 @@ import os, re +def findOrderID(filename): + f = open(filename) + for line in f.readlines(): + match = re.match(r'.*\\order{([^}])}.*', line) + if match != None: + return int(match.group(1)) + return 1000 + def process(target, filename): f = open(filename) inheader = False @@ -36,9 +44,15 @@ def traverse(target, dirname, files): or suffix == 'converter' or suffix == 'qtgui': return + ordering = [] for filename in files: if '.cpp' == os.path.splitext(filename)[1]: - process(target,os.path.join(dirname, filename)) + fname = os.path.join(dirname, filename) + ordering = ordering + [(findOrderID(fname), fname)] + ordering = sorted(ordering, key = lambda entry: entry[0]) + + for entry in ordering: + process(target, entry[1]) os.chdir(os.path.dirname(__file__)) f = open('plugins_generated.tex', 'w') diff --git a/doc/macros.sty b/doc/macros.sty index 298bd7af..f8408cc0 100644 --- a/doc/macros.sty +++ b/doc/macros.sty @@ -9,6 +9,7 @@ % Macros that are used in the plugin documentation \newcommand{\plugin}[2]{\newpage\subsubsection{#2 (\texttt{#1})}\label{plg:#1}} \newcommand{\pluginref}[1]{\texttt{\hyperref[plg:#1]{#1}}} +\newcommand{\order}[1]{} % Ignore \newcommand{\Transform}{\texttt{transform}} \newcommand{\Spectrum}{\texttt{spectrum}} diff --git a/src/bsdfs/conductor.cpp b/src/bsdfs/conductor.cpp index 8c16396b..c4807b3f 100644 --- a/src/bsdfs/conductor.cpp +++ b/src/bsdfs/conductor.cpp @@ -22,7 +22,8 @@ MTS_NAMESPACE_BEGIN -/*! \plugin{conductor}{Smooth conductor} +/*!\plugin{conductor}{Smooth conductor} + * \order{5} * \parameters{ * \parameter{preset}{\String}{Name of a material preset, see * \tblref{conductor-iors}.\!\default{\texttt{Cu} / copper}} @@ -71,9 +72,9 @@ MTS_NAMESPACE_BEGIN * separate measurements correponding to their two indices of * refraction (named ``ordinary'' and ``extraordinary ray''). * - * When using this plugin, you should compile Mitsuba with support for spectral - * renderings to get the most accurate results. While it also works in RGB mode, - * the computations will be much more approximate in this case. + * When using this plugin, you should ideally compile Mitsuba with support for + * spectral renderings to get the most accurate results. While it also works + * in RGB mode, the computations will be much more approximate in this case. * * \begin{xml}[caption=Material configuration for a smooth conductor with * measured gold data, label=lst:conductor-gold] @@ -85,7 +86,8 @@ MTS_NAMESPACE_BEGIN * \end{xml} * \vspace{5mm} * It is also possible to load spectrally varying index of refraction data from - * two external files (see \secref{format-spectra} for details on the file + * two external files containing the real and imaginary components, + * respectively (see \secref{format-spectra} for details on the file * format): * \begin{xml}[caption=Rendering a smooth conductor with custom data] * diff --git a/src/bsdfs/dielectric.cpp b/src/bsdfs/dielectric.cpp index 5422fbeb..5ba5a1cc 100644 --- a/src/bsdfs/dielectric.cpp +++ b/src/bsdfs/dielectric.cpp @@ -22,8 +22,8 @@ MTS_NAMESPACE_BEGIN -/*! \plugin{dielectric}{Smooth dielectric material} - * +/*!\plugin{dielectric}{Smooth dielectric material} + * \order{4} * \parameters{ * \parameter{intIOR}{\Float\Or\String}{Interior index of refraction specified * numerically or using a known material name. \default{\texttt{bk7} / 1.5046}} @@ -45,7 +45,7 @@ MTS_NAMESPACE_BEGIN * * This plugin models an interface between two dielectric materials having mismatched * indices of refraction (for instance, water and air). Exterior and interior IOR values - * can be independently specified, where ``exterior'' refers to the side that contains + * can be specified independently, where ``exterior'' refers to the side that contains * the surface normal. When no parameters are given, the plugin activates the defaults, which * describe a borosilicate glass BK7/air interface. * @@ -126,11 +126,11 @@ MTS_NAMESPACE_BEGIN * \caption{ * \label{tbl:dielectric-iors} * This table lists all supported material names along with - * along with the associated index of refraction at - * standard conditions. These can be used with the plugins + * along with their associated index of refraction at standard + * conditions. These material names can be used with the plugins * \pluginref{dielectric},\ * \pluginref{roughdielectric},\ - * \pluginref{plastic}, and + * \pluginref{plastic}, as well as * \pluginref{roughplastic}. * } * \end{table} diff --git a/src/bsdfs/diffuse.cpp b/src/bsdfs/diffuse.cpp index f01edeb3..0e7ab120 100644 --- a/src/bsdfs/diffuse.cpp +++ b/src/bsdfs/diffuse.cpp @@ -22,8 +22,8 @@ MTS_NAMESPACE_BEGIN -/*! \plugin{diffuse}{Smooth diffuse material} - * +/*!\plugin{diffuse}{Smooth diffuse material} + * \order{1} * \parameters{ * \lastparameter{reflectance}{\Spectrum\Or\Texture}{ * Specifies the diffuse reflectance / albedo of the material \linebreak(Default: 0.5) @@ -35,7 +35,7 @@ MTS_NAMESPACE_BEGIN * \rendering{Textured reflectance, see \lstref{diffuse-textured}}{bsdf_diffuse_textured} * } * - * The smooth diffuse material (often referred to as ``Lambertian'' materials) + * The smooth diffuse material (sometimes referred to as ``Lambertian'') * represents an ideally diffuse material with a user-specified amount of * reflectance. Any received illumination is scattered so that the surface * looks the same independently of the direction of observation. @@ -49,14 +49,15 @@ MTS_NAMESPACE_BEGIN * Note that this material is one-sided---that is, observed from the * back side, it will be completely black. If this is undesirable, * consider using the \pluginref{twosided} BRDF adapter plugin. + * \vspace{4mm} * - * \begin{xml}[caption=Reflectance specified as an sRGB color, label=lst:diffuse-uniform] + * \begin{xml}[caption={A diffuse material, whose reflectance is specified as an sRGB color}, label=lst:diffuse-uniform] * * * * \end{xml} * - * \begin{xml}[caption=Diffuse material with a texture map, label=lst:diffuse-textured] + * \begin{xml}[caption=A diffuse material with a texture map, label=lst:diffuse-textured] * * * diff --git a/src/bsdfs/microfacet.h b/src/bsdfs/microfacet.h index 60a2fa27..06662f67 100644 --- a/src/bsdfs/microfacet.h +++ b/src/bsdfs/microfacet.h @@ -322,6 +322,11 @@ public: return smithG1(wi, m, alphaU) * smithG1(wo, m, alphaU); } else { + /* Can't see the back side from the front and vice versa */ + if (dot(wi, m) * Frame::cosTheta(wi) <= 0 || + dot(wo, m) * Frame::cosTheta(wo) <= 0) + return 0.0f; + /* Infinite groove shadowing/masking */ const Float nDotM = std::abs(Frame::cosTheta(m)), nDotWo = std::abs(Frame::cosTheta(wo)), diff --git a/src/bsdfs/roughconductor.cpp b/src/bsdfs/roughconductor.cpp index 32eb855e..32426bc4 100644 --- a/src/bsdfs/roughconductor.cpp +++ b/src/bsdfs/roughconductor.cpp @@ -33,7 +33,8 @@ MTS_NAMESPACE_BEGIN */ #define ENLARGE_LOBE_TRICK 0 -/*! \plugin{roughconductor}{Rough conductor material} +/*!\plugin{roughconductor}{Rough conductor material} + * \order{6} * \parameters{ * \parameter{distribution}{\String}{ * Specifies the type of microfacet normal distribution diff --git a/src/bsdfs/roughdielectric.cpp b/src/bsdfs/roughdielectric.cpp index 551f461c..ade91219 100644 --- a/src/bsdfs/roughdielectric.cpp +++ b/src/bsdfs/roughdielectric.cpp @@ -30,7 +30,8 @@ MTS_NAMESPACE_BEGIN */ #define ENLARGE_LOBE_TRICK 1 -/*! \plugin{roughdielectric}{Rough dielectric material} +/*!\plugin{roughdielectric}{Rough dielectric material} + * \order{4} * \parameters{ * \parameter{distribution}{\String}{ * Specifies the type of microfacet normal distribution @@ -70,7 +71,7 @@ MTS_NAMESPACE_BEGIN * factor used to modulate the reflectance component\default{1.0}} * \lastparameter{specular\showbreak Transmittance}{\Spectrum\Or\Texture}{Optional * factor used to modulate the transmittance component\default{1.0}} - * } + * }\vspace{4mm} * * This plugin implements a realistic microfacet scattering model for rendering * rough interfaces between dielectric materials, such as a transition from air to @@ -81,12 +82,10 @@ MTS_NAMESPACE_BEGIN * off-specular reflections peaks observed in real-world measurements of such * materials. * \renderings{ - * \medrendering{Rough glass (Beckmann, $\alpha$=0.1)} + * \rendering{Anti-glare glass (Beckmann, $\alpha=0.02$)} + * {bsdf_roughdielectric_beckmann_0_0_2.jpg} + * \rendering{Rough glass (Beckmann, $\alpha=0.1$)} * {bsdf_roughdielectric_beckmann_0_1.jpg} - * \medrendering{Ground glass (GGX, $\alpha$=0.304, - * \lstref{roughdielectric-roughglass})}{bsdf_roughdielectric_ggx_0_304.jpg} - * \medrendering{Textured rougness (\lstref{roughdielectric-textured})} - * {bsdf_roughdielectric_textured.jpg} * } * * This plugin is essentially the ``roughened'' equivalent of the (smooth) plugin @@ -94,11 +93,11 @@ MTS_NAMESPACE_BEGIN * be very similar, though scenes using this plugin will take longer to render * due to the additional computational burden of tracking surface roughness. * - * The implementation of this plugin is based on the paper ``Microfacet Models + * The implementation is based on the paper ``Microfacet Models * for Refraction through Rough Surfaces'' by Walter et al. * \cite{Walter07Microfacet}. It supports several different types of microfacet * distributions and has a texturable roughness parameter. Exterior and - * interior IOR values can be independently specified, where ``exterior'' + * interior IOR values can be specified independently, where ``exterior'' * refers to the side that contains the surface normal. Similar to the * \pluginref{dielectric} plugin, IOR values can either be specified * numerically, or based on a list of known materials (see @@ -107,16 +106,28 @@ MTS_NAMESPACE_BEGIN * glass BK7/air interface with a light amount of roughness modeled using a * Beckmann distribution. * - * To get an intuition about the range and effects of the surface roughness - * parameter $\alpha$, consider the following: a value of - * $\alpha=0.001-0.01$ corresponds a material with slight imperfections on an + * To get an intuition about the effect of the surface roughness + * parameter $\alpha$, consider the following approximate differentiation: + * a value of $\alpha=0.001-0.01$ corresponds to a material + * with slight imperfections on an * otherwise smooth surface finish, $\alpha=0.1$ is relatively rough, - * and $\alpha=0.3-0.5$ is \emph{extremely} rough (e.g. a etched or ground + * and $\alpha=0.3-0.5$ is \emph{extremely} rough (e.g. an etched or ground * finish). * - * When using the Ashikhmin-Shirley or Phong models, a conversion method is - * used to turn the specified $\alpha$ roughness value into the exponents - * of these distributions. This is done in a way, such that the different + * Please note that when using this plugin, it is crucial that the scene contains + * meaningful and mutally compatible index of refraction changes---see + * \figref{glass-explanation} for an example of what this entails. Also, note that + * the importance sampling implementation of this model is close, but + * not always a perfect a perfect match to the underlying scattering distribution, + * particularly for high roughness values and when the \texttt{ggx} + * microfacet distribution is used. Hence, such renderings may + * converge slowly. + * + * \subsubsection*{Techical details} + * When rendering with the Ashikhmin-Shirley or Phong microfacet + * distributions, a conversion is used to turn the specified + * $\alpha$ roughness value into the exponents of these distributions. + * This is done in a way, such that the different * distributions all produce a similar appearance for the same value of * $\alpha$. * @@ -124,18 +135,16 @@ MTS_NAMESPACE_BEGIN * of two distinct roughness values along the tangent and bitangent * directions. This can be used to provide a material with a ``brushed'' * appearance. The alignment of the anisotropy will follow the UV - * parameterization of the underlying mesh\footnote{Therefore, - * such anisotropic materials cannot be applied to triangle meshes that - * are missing texture coordinates.}. + * parameterization of the underlying mesh in this case. This means that + * such an anisotropic material cannot be applied to triangle meshes that + * are missing texture coordinates.\newpage * - * When using this plugin, it is crucial that the scene contains - * meaningful and mutally compatible index of refraction changes---see - * \figref{glass-explanation} for an example. Also, please note that - * the importance sampling implementation of this model is close, but - * not always a perfect a perfect match to the underlying scattering distribution, - * particularly for high roughness values and when the \texttt{ggx} - * microfacet distribution is used. Hence, such renderings may - * converge slowly. + * \renderings{ + * \rendering{Ground glass (GGX, $\alpha$=0.304, + * \lstref{roughdielectric-roughglass})}{bsdf_roughdielectric_ggx_0_304.jpg} + * \rendering{Textured rougness (\lstref{roughdielectric-textured})} + * {bsdf_roughdielectric_textured.jpg} + * } * * \begin{xml}[caption=A material definition for ground glass, label=lst:roughdielectric-roughglass] * diff --git a/src/libcore/statistics.cpp b/src/libcore/statistics.cpp index 7ae7fcf7..898e8ecd 100644 --- a/src/libcore/statistics.cpp +++ b/src/libcore/statistics.cpp @@ -171,7 +171,8 @@ std::string Statistics::getStats() { float baseValue = (float) counter->getBase(); int suffixIndex = 0, suffixIndex2 = 0; - if (value == 0 && counter->getType() != EPercentage) + if ((counter->getType() != EPercentage && value == 0) || + (counter->getType() == EPercentage && baseValue == 0)) continue; if (category != counter->getCategory()) {