From 9704b2a1a5b49ca7b47496558c392623efca3bc6 Mon Sep 17 00:00:00 2001 From: Jonathan Stone Date: Sat, 8 Jun 2024 11:25:45 -0700 Subject: [PATCH 01/18] Update OpenPBR default example (#216) This changelist updates the OpenPBR default example, matching its values to the latest default values of the shading model. --- examples/open_pbr_default.mtlx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/open_pbr_default.mtlx b/examples/open_pbr_default.mtlx index 85c5379..756eda8 100644 --- a/examples/open_pbr_default.mtlx +++ b/examples/open_pbr_default.mtlx @@ -20,7 +20,7 @@ - + @@ -35,8 +35,8 @@ - - + + From e8214894a821a3aae803e8e8d1cf3fa7a4d58999 Mon Sep 17 00:00:00 2001 From: Jamie Portsmouth Date: Tue, 11 Jun 2024 17:51:57 +0100 Subject: [PATCH 02/18] Change thin film IOR default (#211) From 1.5 to 1.4. As this won't make much difference to the look in implementations that ignore the adjacent IORs of the film. But for those that take it into account, this will make the film visible rather than invisible by default (since `specular_ior` is 1.5 by default, and `coat_ior` 1.6). --- examples/open_pbr_default.mtlx | 2 +- index.html | 2 +- parametrization.md.html | 2 +- reference/open_pbr_surface.mtlx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/open_pbr_default.mtlx b/examples/open_pbr_default.mtlx index 756eda8..8125541 100644 --- a/examples/open_pbr_default.mtlx +++ b/examples/open_pbr_default.mtlx @@ -37,7 +37,7 @@ - + diff --git a/index.html b/index.html index 0442675..8b6347c 100644 --- a/index.html +++ b/index.html @@ -868,7 +868,7 @@ --------------------------|-----------|----------|:---------------:|:-------------:|:--------:|---------------------------------------------- **`thin_film_weight`** | Weight | `float` | $ [0, 1] $ | | $ 0 $ | Coverage weight of the thin film **`thin_film_thickness`** | Thickness | `float` | $ [0, \infty) $ | $ [0, 1] $ | $ 0.5 $ | Thickness of the film in micrometers ($\mathrm{\mu m}$) -**`thin_film_ior`** | IOR | `float` | $ (0, \infty) $ | $ [1, 3] $ | $ 1.5 $ | Refractive index of the film +**`thin_film_ior`** | IOR | `float` | $ (0, \infty) $ | $ [1, 3] $ | $ 1.4 $ | Refractive index of the film ![](images/thin_film_0nm.png width=99%) ![](images/thin_film_300nm.png width=99%) ![](images/thin_film_600nm.png width=99%)
diff --git a/parametrization.md.html b/parametrization.md.html index eb37cb0..d87d158 100644 --- a/parametrization.md.html +++ b/parametrization.md.html @@ -63,7 +63,7 @@ | **Thin-film** | | `thin_film_weight` | Weight | `float` | $ [0, 1] $ | | $ 0 $ | | | `thin_film_thickness` | Thickness | `float` | $ [0, \infty) $ | $ [0, 1] $ | $ 0.5 $ | $\mathrm{\mu m}$ | -| `thin_film_ior` | IOR | `float` | $ (0, \infty) $ | $ [1, 3] $ | $ 1.5 $ | | +| `thin_film_ior` | IOR | `float` | $ (0, \infty) $ | $ [1, 3] $ | $ 1.4 $ | | | **Geometry** | | `geometry_opacity` | Opacity | `float` | $ [0, 1] $ | | $ 1 $ | | | `geometry_thin_walled` | Thin walled | `boolean` | {false, true} | | false | | diff --git a/reference/open_pbr_surface.mtlx b/reference/open_pbr_surface.mtlx index d57a18a..b74bae0 100644 --- a/reference/open_pbr_surface.mtlx +++ b/reference/open_pbr_surface.mtlx @@ -69,7 +69,7 @@ doc="Coverage weight of the thin-film. Use for materials such as multi-tone car paint or soap bubbles." /> - From 660b2063ab8d341ae8561813ba4a65eda338849e Mon Sep 17 00:00:00 2001 From: Jamie Portsmouth Date: Tue, 11 Jun 2024 18:43:03 +0100 Subject: [PATCH 03/18] Add note about dark fuzz (#207) Addressing https://github.com/AcademySoftwareFoundation/OpenPBR/issues/176 --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 8b6347c..0811b37 100644 --- a/index.html +++ b/index.html @@ -1074,7 +1074,7 @@ The fuzz BRDF $f_\mathrm{fuzz}$ and VDF $V_\mathrm{fuzz}$ are assumed to be derived from an anisotropic microflake volume model with a fiber-like distribution. We recommend the specific model of [#Zeltner2022] (based on the earlier work of [#Heitz2015]), which has the following characteristics: -- The fuzz represents a homogeneous volumetric layer with a fiber-like SGGX microflake [#Heitz2015] phase function. This is approximated using a Linearly Transformed Cosines (LTC) model [#Heitz2016b] fitted to volumetric simulations. The microflake fibers are assumed to have a single-scattering albedo that effectively produces a reflection tinted with the **`fuzz_color`** after multiple scattering. +- The fuzz represents a homogeneous volumetric layer with a fiber-like SGGX microflake [#Heitz2015] phase function. This is approximated using a Linearly Transformed Cosines (LTC) model [#Heitz2016b] fitted to volumetric simulations. The microflake fibers are assumed to have a single-scattering albedo that effectively produces a reflection tinted with the **`fuzz_color`** after multiple scattering, allowing the fuzz to darken as well as lighten. - The volumetric fuzz layer is assumed to have a fixed unit optical thickness in all channels, and is purely scattering so no energy is absorbed. Thus any light not reflected after multiple scattering is assumed to transmit to the lower layers, and the transmittance is gray so the base is not tinted by the fuzz. The amount of this fixed thickness fuzz is controlled via the layer coverage weight **`fuzz_weight`**. The fuzz layer is also assumed to be index-matched with the adjacent slab above it, i.e. the fibers are embedded in the surrounding dielectric medium, thus there is no Fresnel reflection from the slab. - The **`fuzz_roughness`** parameter controls how fibre-like the microflake distribution of the layer is. At low roughness the microflakes are highly fibre-like (i.e. thin fibres oriented along the normal) producing a high-sheen fabric appearance, while at high roughness the microflakes are spherical producing a dusty appearance. From 1130bd6c62786b114a0e12e2c84d2e3b0d7b6db7 Mon Sep 17 00:00:00 2001 From: Jamie Portsmouth Date: Wed, 12 Jun 2024 17:20:17 +0100 Subject: [PATCH 04/18] Some minor rewording improvements/clarifications --- index.html | 56 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/index.html b/index.html index 0442675..b83f394 100644 --- a/index.html +++ b/index.html @@ -190,11 +190,11 @@ It also ensures that if the substrate BSDF perfectly preserves energy, i.e. $E_\mathrm{sub}(\omega_o) = 1$, then the layer BSDF does also, ensuring that a "white furnace" test would pass. The Autodesk Standard Surface model [#Georgiev2019] uses this formulation for its layering. Note though that this albedo-scaling approximation does not correctly take into account the effect of multiple light bounces back and forth between the interfaces, or absorption and scattering in the volumetric medium of the coat $V_\mathrm{coat}$. In general the resulting BSDF lobe shape will not be a simple linear combination of the interface BSDFs. -To some extent these effects can be put back into the albedo-scaling model by making various approximations. For example the effect of the volumetric transmittance through the coat in the incident and output directions could be approximately modeled as +To some extent these effects can be put back into the albedo-scaling model by making various approximations. For example the effect of the volumetric absorption through the coat in the incident and output directions could be approximately modeled as \begin{equation} \label{non-reciprocal-albedo-scaling-with-T} -f_\mathrm{layer}(\omega_i, \omega_o) = f_\mathrm{coat}(\omega_i, \omega_o) + T_\mathrm{coat}(\omega_i, \omega_o) \bigl(1 - E_\mathrm{coat}(\omega_o)\bigr) \,f_\mathrm{sub}(\omega_i, \omega_o) +f_\mathrm{layer}(\omega_i, \omega_o) = f_\mathrm{coat}(\omega_i, \omega_o) + T_\mathrm{coat}(\omega_i, \omega_o) \bigl(1 - E_\mathrm{coat}(\omega_o)\bigr) \,f_\mathrm{sub}(\omega_i, \omega_o) \end{equation} -where $T_\mathrm{coat}(\omega_i, \omega_o)$ accounts for the total volumetric absorption of the coat along the input and output rays. Similarly if the coat is rough this will effectively roughen the substrate BSDF lobe also, which can be accounted for approximately via various heuristics. +where $T_\mathrm{coat}(\omega_i, \omega_o)$ accounts for the total volumetric transmittance of the coat along the input and output rays. Similarly if the coat is rough this will effectively roughen the substrate BSDF lobe also, which can be accounted for approximately via various heuristics. Complete conformance to the spec is defined as reproducing all the physical inter-layer light transport effects, though this is not typically practical. In practice, each implementation must decide what level of approximation to use for the light transport within layers, trading off accuracy for efficiency according to its own particular use case. @@ -261,7 +261,7 @@ \begin{equation} f_\mathrm{layer} = f_\mathrm{coat} + T_\mathrm{coat} \left(1 - E_\mathrm{coat}\right) \,f_\mathrm{sub} \end{equation} -where $f_\mathrm{coat}$ is the BSDF of the coat and $T_\mathrm{coat}$ is its transmittance. Thus combining these [^lerp], +where $f_\mathrm{coat}$ is the BSDF of the coat and $T_\mathrm{coat}$ is the volumetric transmittance along the path of the input and output rays. Thus combining these [^lerp], \begin{equation} \label{coat_layering_formula_with_albedo_scaling} f_\mathrm{weighted-layer} = w_\mathrm{coat} f_\mathrm{coat} + \mathrm{lerp}\bigl(1, T_\mathrm{coat} (1 - E_\mathrm{coat}), w_\mathrm{coat}\bigr) f_\mathrm{sub} \ , \end{equation} @@ -388,8 +388,7 @@ The _masking-shadowing function_ $G(\omega_i, \omega_o)$ accounts for the probability that the input and output directions are occluded by the microsurface. It is usually derived using the Smith model which determines $G$ given the NDF, and for the GGX NDF equation [GGX] the masking-shadowing function then has a well-known form [#Heitz2014]. -The _Normal Distribution Function_ (NDF) $D(m)$ describes the relative probability of occurrence of micronormal $m$ on the surface, and thus the roughness characteristics. -A popular form of NDF which well-approximates the roughness of real materials is the so-called GGX distribution (this name derives from "ground glass", but the formula was originally due to Trowbridge and Reitz [#Walter2007], [#Burley2012], [#Heitz2014], [#Pharr2023]), which has the basic [^normalization] form: +The _Normal Distribution Function_ (NDF) $D(m)$ describes the relative probability of occurrence of micronormal $m$ on the surface, and thus the roughness characteristics. We assume that the NDF is the so-called GGX distribution which well-approximates the roughness of real materials (the name GGX derives from "ground glass", but the formula was originally due to Trowbridge and Reitz [#Walter2007], [#Burley2012], [#Heitz2014], [#Pharr2023]), which has the basic [^normalization] form: \begin{equation} \label{GGX} D_\mathrm{GGX}(m) \propto \left( 1 + \frac{\tan^2\theta_m}{\alpha^2} \right)^{-2} \end{equation} @@ -898,8 +897,6 @@ * +-------------------------------------------------+ * ******************************************************* -The absorption of the medium $V_\mathrm{coat}$ is parametrized by **`coat_color`**, which is assumed to specify the _square_ of the transmittance $T_\mathrm{coat}$ of the coat at normal incidence (i.e. $T^2_\mathrm{coat}$ = **`coat_color`**). Thus at normal incidence, the observed tint color of the underlying base due to absorption in the coat is approximately given by **`coat_color`** due to the absorption along the incident and outgoing rays (note that the specular reflection from the coat itself is _not_ tinted). - The IOR $n_c = \mathtt{coat\_ior}$ of the coat medium $V_\mathrm{coat}$ will alter the Fresnel factor of both the coat top interface and the underlying metal or dielectric. If there is a fractional $\mathtt{coat\_weight}$ $\mathtt{C}$, then the surrounding IOR of the base dielectric or metal varies statistically across the surface depending on whether the coat is locally present (and the fuzz layer can be assumed to have the ambient IOR $n_a$). The ratio between the specular IOR $n_b = \mathtt{specular\_ior}$ and the surrounding medium can thus reasonably be approximated as \begin{equation} \label{specular_ior_ratio} \eta_s = \mathrm{lerp}(n_b/n_a, n_b/n_c, \mathtt{C}) \ . @@ -907,6 +904,19 @@ This ratio then determines the specular Fresnel factor, as in equation [modulated_ior]. (Note that as discussed in the coat [TIR](index.html#model/coat/totalinternalreflection) section, evaluation of the specular Fresnel factor may need to be further modified to model the refraction of the ray inside the coat). +The absorption of the medium $V_\mathrm{coat}$ is parametrized by **`coat_color`**, which is assumed to specify the _square_ of the transmittance of the coat at normal incidence (i.e. $T_\mathrm{coat}$ = **`coat_color`** in the notation of equation [non-reciprocal-albedo-scaling-with-T]). Thus the observed tint color of the underlying base due to absorption in the coat is approximately given by **`coat_color`** due to the absorption along the incident and outgoing rays (note that the specular reflection from the coat itself is _not_ tinted). + +In the full light transport within the coat, various physical effects occur which we assume are accounted for in the ground truth appearance: + + - The observed color of the coated base is darkened and saturated due to multiple internal reflections from the inside of the coat, which causes light to strike the underlying material multiple times and undergo more absorption. This effect is controlled via the **`coat_darkening`** parameter, as described in the coat Darkening section. + + - The observed **`coat_color`** tint also darkens as the incidence angle changes due to the change in path length in the medium, as described in the View-dependent absorption section. + + - The presence of a rough coat will increase the apparent roughness of the BSDF lobes of the underlying base. A recommendation for implementation of this effect is given in the coat Roughening section. + + - Care needs to be taken in the implementation to account for the refraction of the ray direction inside the coat. This is discussed in the Total internal reflection section. + +
Coat params | Label | Type | Range | Norm | Default | Description --------------------------------|------------|----------|:---------------:|:----------:|:-------------:|---------------------------------------------- @@ -922,22 +932,6 @@ ![Figure [coat]: Coat adds a secondary specular highlight and optional absorption tint](dummy)
-In the full light transport, the observed color of the coated base is darkened and saturated due to multiple internal reflections from the inside of the coat, which causes light to strike the underlying material multiple times and undergo more absorption, and the observed **`coat_color`** tint also darkens as the incidence angle changes due to the change in path length in the medium. Also, the presence of a rough coat will increase the apparent roughness of the BSDF lobes of the underlying base. - -We assume that in the ground truth appearance, all these physical effects are accounted for [^porosity]. In the following sub-sections, we detail recommendations for implementation of them. - - -### Roughening - -If the coat is rough, the microfacet BSDF lobes of the underlying base substrate (metal and dielectric) are also effectively roughened. If this is not otherwise accounted for by the light transport, it can instead be reasonably approximated by directly altering the NDF of the base BSDFs. - -A formula we recommend for this is obtained by identifying the NDF of each microfacet lobe as corresponding approximately to a Gaussian in slope-space with variance given by $\alpha_t^2 + \alpha_b^2 = r^4$ (in the notation of the [Microfacet model](index.html#model/microfacetmodel) section). Modeling the effect of the roughening as the convolution of these Gaussian NDFs (and double counting the coat variance since the reflection passes through the coat boundary twice), the resulting modified roughness of the base, $r'_\mathrm{B}$, (taking into account the presence weight of the coat, $\mathtt{C}=$ **`coat_weight`**) is given by -\begin{equation} -r'_\mathrm{B} = \mathrm{lerp}\Bigl( r_\mathrm{B}, \mathrm{min} \bigl(1, r^4_\mathrm{B} + 2 r^4_\mathrm{C} \bigr)^\frac{1}{4}, \mathtt{C} \Bigr) -\end{equation} -where $r_\mathrm{B}=$ **`specular_roughness`** and $r_\mathrm{C}=$ **`coat_roughness`**. - - ### Darkening Figure [coat_darkening_grid] shows the physically-correct change in appearance (at normal incidence) of a textured diffuse base with a wood texture and smooth clear-coat as the IOR of the clear-coat is varied, exhibiting darkening of the base -- due to the internal reflections in the coat -- which increases as IOR increases. @@ -1016,6 +1010,18 @@ ![Figure [coat_view_dependent_absorption_color]: The color of an absorbing coat becomes darker and more saturated at grazing angles.](images/coat_view_dependent_absorption_color.png width="75%") +### Roughening + +If the coat is rough, the microfacet BSDF lobes of the underlying base substrate (metal and dielectric) are also effectively roughened. If this is not otherwise accounted for by the light transport, it can instead be reasonably approximated by directly altering the NDF of the base BSDFs. + +A formula we recommend for this is obtained by identifying the NDF of each microfacet lobe as corresponding approximately to a Gaussian in slope-space with variance given by $\alpha_t^2 + \alpha_b^2 = r^4$ (in the notation of the [Microfacet model](index.html#model/microfacetmodel) section). Modeling the effect of the roughening as the convolution of these Gaussian NDFs (and double counting the coat variance since the reflection passes through the coat boundary twice), the resulting modified roughness of the base, $r'_\mathrm{B}$, (taking into account the presence weight of the coat, $\mathtt{C}=$ **`coat_weight`**) is given by +\begin{equation} +r'_\mathrm{B} = \mathrm{lerp}\Bigl( r_\mathrm{B}, \mathrm{min} \bigl(1, r^4_\mathrm{B} + 2 r^4_\mathrm{C} \bigr)^\frac{1}{4}, \mathtt{C} \Bigr) +\end{equation} +where $r_\mathrm{B}=$ **`specular_roughness`** and $r_\mathrm{C}=$ **`coat_roughness`**. + + + ### Total internal reflection A technical issue which can cause difficulties in the implementation of the BRDF of the coated dielectric base should also be mentioned. @@ -1302,7 +1308,7 @@ Here the substrate lobes $\color{darkblue}{f^T_\textrm{specular}}$ and $\color{darkblue}{f_\textrm{SSS}}$ are technically BSSRDFs, which model the entry into the internal medium via the dielectric interface, transport of light from entry point to exit points including absorption and scattering processes, and exit from the medium back though the interface, generating both a reflection and transmission component. [^BSDF_BSSRDF_sum] The "specular" BTDF/BSSRDF $\color{darkblue}{f^T_\textrm{specular}}$ corresponds to transmission into the medium parametrized in the Translucent base section, and BSSRDF $\color{darkblue}{f_\textrm{SSS}}$ corresponds to transmission into the medium parametrized in the Subsurface section. In the case of $f_\textrm{glossy-diffuse}$, the BSSRDF degenerates into the BRDF $\color{darkblue}{f_\mathrm{diffuse}}$ as described in the Glossy-diffuse section. -Note that in this albedo-scaling approximation, the transmission Fresnel factor associated with $\color{darkblue}{f^T_\textrm{specular}}$ and $f_\textrm{SSS}$ can be *omitted* as the energy conservation of the dielectric BSDF as a whole is maintained automatically, even without explicit multiple scattering compensation or in the presence of modifications to the reflection Fresnel factor via **`specular_color`**. +Note that in this albedo-scaling approximation, the transmission Fresnel factor associated with $\color{darkblue}{f^T_\textrm{specular}}$ and $\color{darkblue}{f_\textrm{SSS}}$ can be *omitted* as the energy conservation of the dielectric BSDF as a whole is maintained automatically, even without explicit multiple scattering compensation or in the presence of modifications to the reflection Fresnel factor via **`specular_color`**. Since $\color{darkblue}{f^R_\textrm{specular}}$ appears in each of the three component slabs of the dielectric base, it follows that on collecting terms, $f_\textrm{dielectric-base}$ reduces to: From 5bb9a13ec1bcc1e33fe6fcecf089605600c0eae4 Mon Sep 17 00:00:00 2001 From: Jonathan Stone Date: Sun, 16 Jun 2024 17:58:30 -0700 Subject: [PATCH 05/18] Enable Zeltner sheen (#217) This changelist enables Zeltner sheen in the reference implementation of OpenPBR, leveraging the new functionality in MaterialX 1.39. Additionally, the open_pbr_velvet.mtlx example has been updated to account for the visual differences between Conty-Kulla and Zeltner sheen. --- examples/open_pbr_velvet.mtlx | 2 +- reference/open_pbr_surface.mtlx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/open_pbr_velvet.mtlx b/examples/open_pbr_velvet.mtlx index 25b72cc..2b2da96 100644 --- a/examples/open_pbr_velvet.mtlx +++ b/examples/open_pbr_velvet.mtlx @@ -8,6 +8,6 @@ - + diff --git a/reference/open_pbr_surface.mtlx b/reference/open_pbr_surface.mtlx index b74bae0..665e369 100644 --- a/reference/open_pbr_surface.mtlx +++ b/reference/open_pbr_surface.mtlx @@ -558,12 +558,12 @@ - + From e6427ba9aef2de1d05cec6d7060dde34d7ab39dc Mon Sep 17 00:00:00 2001 From: Jamie Portsmouth Date: Tue, 25 Jun 2024 17:37:30 +0100 Subject: [PATCH 06/18] Add a "resources" section to the front page (#215) With links to - MaterialX web viewer running OpenPBR default material - OpenPBR-viewer project and web app --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index a915e94..c81cc8b 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,12 @@ OpenPBR Surface is an open standard hosted by the [Academy Software Foundation]( * **[Reference implementation](reference/open_pbr_surface.mtlx)** – written in [MaterialX](https://materialx.org/) * **[BibTeX citation](openpbr.bib)** +### Resources + +* [MaterialX Web Viewer](https://academysoftwarefoundation.github.io/MaterialX/?file=Materials/Examples/OpenPbr/open_pbr_default.mtlx) - WebGL rasterization renderer using MaterialX [implementation](reference/open_pbr_surface.mtlx) of OpenPBR +* [OpenPBR-viewer](https://github.com/portsmouth/OpenPBR-viewer) - self-contained example implementation in a WebGL pathtracer (run [here](https://portsmouth.github.io/OpenPBR-viewer)) +* [#openpbr](https://academysoftwarefdn.slack.com/channels/openpbr) - public Slack channel for discussions, hosted by ASWF +
[![License: CC BY-SA 4.0](https://img.shields.io/badge/License-Apache%202.0-informational.svg)](LICENSE) From 8d2631ee8e9a21bb7997c082fe3d0d0c09d97639 Mon Sep 17 00:00:00 2001 From: Jamie Portsmouth Date: Tue, 25 Jun 2024 17:38:38 +0100 Subject: [PATCH 07/18] Clarify formula for emission color (#209) Following the discussion of https://github.com/AcademySoftwareFoundation/OpenPBR/issues/85. --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 0811b37..efabcd0 100644 --- a/index.html +++ b/index.html @@ -1128,7 +1128,7 @@ * +-------------------------------------------------+ * ******************************************************* -The intensity of the EDF is controlled by a luminance and a color multiplier. The **`emission_luminance`** parameter controls the luminance the emissive layer would have when **`emission_color`** is set to (1, 1, 1) and in the absence of coat and fuzz. The **`emission_color`** acts as a multiplier, thus the resulting luminance may be less than the input parameter, or even zero if the color multiplier is set to (0, 0, 0). +The intensity of the EDF is controlled by a luminance and a color multiplier. The **`emission_luminance`** parameter controls the luminance the emissive layer would have when **`emission_color`** is set to (1, 1, 1) and in the absence of coat and fuzz. The **`emission_color`** acts as a multiplier, i.e. the HDR emission in the model color space is defined to have a color given by **`emission_color`** * **`emission_luminance`**, thus the resulting luminance may be less than the input parameter, or even zero if the **`emission_color`** is set to (0, 0, 0). Moreover, the overall material luminance may be further reduced in the presence of coat or fuzz, as they can absorb light coming from the emissive layer before it exits the surface. The emission from the top surface should in principle gain a directional dependence due to the combined effects of absorption, total internal reflection (TIR) and multiple bounces in the coat layer, and absorption in the fuzz layer. The combined effect should result mostly in darkening and saturation at grazing angles. From 5bcea3687c9b2070fc1d0d88940d5fbcd43dbce5 Mon Sep 17 00:00:00 2001 From: Jonathan Stone Date: Thu, 27 Jun 2024 06:34:08 -0700 Subject: [PATCH 08/18] Update subsurface color types (#220) This changelist updates the types associated with physical color values for subsurface scattering in OpenPBR, aligning with the conclusions of recent threads on ASWF Slack channels. - Change `subsurface_radius_scale` from a `vector3` to a `color3` in the specification, aligning with the MaterialX implementation of OpenPBR. - Change the `radius` input of `subsurface_bsdf` from a `vector3` to a `color3` in the MaterialX implementation, aligning with the current definition of the `subsurface_bsdf` node in MaterialX 1.39. --- index.html | 2 +- parametrization.md.html | 2 +- reference/open_pbr_surface.mtlx | 9 +++------ 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/index.html b/index.html index efabcd0..0596875 100644 --- a/index.html +++ b/index.html @@ -750,7 +750,7 @@ **`subsurface_weight`** | Weight | `float` | $ [0, 1] $ | | $ 0 $ | Mix weight between subsurface and diffuse slabs **`subsurface_color`** | Color | `color3` | $ [0, 1] $ | | $ (0.8, 0.8, 0.8) $ | The observed reflection color of $V^\infty_\mathrm{subsurface}$ **`subsurface_radius`** | Radius | `float` | $ [0, \infty) $ | $ [0, 1] $ | $ 1 $ | Length scale of MFP -**`subsurface_radius_scale`** | Radius scale | `vector3` | $ [0, 1]^3 $ | | $ (1.0, 0.5, 0.25) $ | RGB multiplier to **`subsurface_radius`**, giving the per-channel MFPs +**`subsurface_radius_scale`** | Radius scale | `color3` | $ [0, 1]^3 $ | | $ (1.0, 0.5, 0.25) $ | RGB multiplier to **`subsurface_radius`**, giving the per-channel MFPs **`subsurface_scatter_anisotropy`** | Anisotropy | `float` | $ [-1, 1] $ | | $ 0 $ | Anisotropy of the Henyey--Greenstein phase function of the interior medium $V^\infty_\mathrm{subsurface}$ ![](images/subsurface1.jpg width=99%) ![](images/subsurface2.jpg width=99%) ![](images/subsurface3.jpg width=99%) diff --git a/parametrization.md.html b/parametrization.md.html index d87d158..7351597 100644 --- a/parametrization.md.html +++ b/parametrization.md.html @@ -44,7 +44,7 @@ | `subsurface_weight` | Weight | `float` | $ [0, 1] $ | | $ 0 $ | | | `subsurface_color` | Color | `color3` | $ [0, 1] $ | | $ (0.8, 0.8, 0.8) $ | | | `subsurface_radius` | Radius | `float` | $ [0, \infty) $ | $ [0, 1] $ | $ 1 $ | length | -| `subsurface_radius_scale` | Radius scale | `vector3` | $ [0, 1]^3 $ | | $ (1.0, 0.5, 0.25) $ | | +| `subsurface_radius_scale` | Radius scale | `color3` | $ [0, 1]^3 $ | | $ (1.0, 0.5, 0.25) $ | | | `subsurface_scatter_anisotropy` | Anisotropy | `float` | $ [-1, 1] $ | | $ 0 $ | | | **Coat** | | `coat_weight` | Weight | `float` | $ [0, 1] $ | | $ 0 $ | | diff --git a/reference/open_pbr_surface.mtlx b/reference/open_pbr_surface.mtlx index 665e369..edd44a5 100644 --- a/reference/open_pbr_surface.mtlx +++ b/reference/open_pbr_surface.mtlx @@ -177,16 +177,13 @@ - - - - - + + - + From aefefb4ca01043be34e4bcf22793a3ab20011efb Mon Sep 17 00:00:00 2001 From: Jonathan Stone Date: Fri, 28 Jun 2024 14:00:37 -0700 Subject: [PATCH 09/18] Update specification and reference to v1.1 (#221) --- index.html | 2 +- reference/open_pbr_surface.mtlx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index 0596875..c5d8579 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ **OpenPBR Surface** -
*Specification v1.0, 2024-06-04.     homepage *
+
*Specification v1.1, 2024-06-28.     homepage *

This document is a specification of a surface shading model intended as a standard for computer graphics: the OpenPBR Surface model. Designed as an über-shader, it aims to be capable of accurately modeling the vast majority of CG materials used in practical visual effects and feature animation productions. The model has been developed as a synthesis of the Autodesk Standard Surface and the Adobe Standard Material models. diff --git a/reference/open_pbr_surface.mtlx b/reference/open_pbr_surface.mtlx index edd44a5..8186482 100644 --- a/reference/open_pbr_surface.mtlx +++ b/reference/open_pbr_surface.mtlx @@ -3,7 +3,7 @@ - From 27a38234b8a226c22803a921e679c4450ed8f427 Mon Sep 17 00:00:00 2001 From: Jamie Portsmouth Date: Fri, 30 Aug 2024 20:01:27 +0100 Subject: [PATCH 10/18] fix footnote ref --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 8a87803..9b6f20e 100644 --- a/index.html +++ b/index.html @@ -906,7 +906,7 @@ The absorption of the medium $V_\mathrm{coat}$ is parametrized by **`coat_color`**, which is assumed to specify the _square_ of the transmittance of the coat at normal incidence (i.e. $T_\mathrm{coat}$ = **`coat_color`** in the notation of equation [non-reciprocal-albedo-scaling-with-T]). Thus the observed tint color of the underlying base due to absorption in the coat is approximately given by **`coat_color`** due to the absorption along the incident and outgoing rays (note that the specular reflection from the coat itself is _not_ tinted). -In the full light transport within the coat, various physical effects occur which we assume are accounted for in the ground truth appearance: +In the full light transport within the coat, various physical effects [^porosity] occur which we assume are accounted for in the ground truth appearance. - The observed color of the coated base is darkened and saturated due to multiple internal reflections from the inside of the coat, which causes light to strike the underlying material multiple times and undergo more absorption. This effect is controlled via the **`coat_darkening`** parameter, as described in the coat Darkening section. From e2a7bda39b678e4f83a9134525e33fd4ccd88d1e Mon Sep 17 00:00:00 2001 From: Jamie Portsmouth Date: Fri, 30 Aug 2024 20:27:24 +0100 Subject: [PATCH 11/18] Thin-walled "case" -> "mode" --- index.html | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/index.html b/index.html index 9b6f20e..bf884a0 100644 --- a/index.html +++ b/index.html @@ -305,7 +305,7 @@ ============================================ Using the operator formalism and parametrization described, we now specify the structure of the OpenPBR surface model. -We describe first the non-thin-walled case (in the [thin-walled case](index.html#model/thin-walledcase) the structure differs), where the material structure looks informally like the following diagram: +We describe first the non-thin-walled mode (in the [thin-walled mode](index.html#model/thin-walledmode) the structure differs), where the material structure looks informally like the following diagram: ************************************************************************************************************ * emission * * ^ * @@ -1170,7 +1170,7 @@ * +- - - - - - - - - - - - - - - - - -+ +- - - - - - - - - - - - + - - - - - - - - - - - -+ * **************************************************************************************************** -Note that in the case of a non-thin-walled material, $\mathtt{\alpha} < 1$ doesn't make strict physical sense unless the entire surface is removed, whereas in the [thin-walled case](index.html#thin-walledcase) the opacity has a clear physical interpretation as the presence weight of the wall (or "cutout" areas where $\mathtt{\alpha} = 0$) like in the leaf render below. +Note that in the case of a non-thin-walled material, $\mathtt{\alpha} < 1$ doesn't make strict physical sense unless the entire surface is removed, whereas in the [thin-walled mode](index.html#thin-walledmode) the opacity has a clear physical interpretation as the presence weight of the wall (or "cutout" areas where $\mathtt{\alpha} = 0$) like in the leaf render below. We generally leave it as an implementation detail for a renderer to determine how connections to light sources be made through the surface. However a very common approximation used by many renderers is "transparent shadows", where a straight-line connection is made to lights and the contribution of the light determined by the total transmittance along the ray, ignoring any refraction events. We give here a suggested form for this shadow ray transmittance. @@ -1208,7 +1208,7 @@ The normal and tangent are assumed to be unit vectors. Reconstruction filtering techniques such as texture filtering may cause the interpolated value to not be normalized, which can be corrected with a renormalization to reduce visible artifacts caused by this filtering. -Thin-walled case +Thin-walled mode ------------------------------------- If the **`geometry_thin_walled`** Boolean is enabled, then the surface is assumed to be in a "thin-walled" mode. @@ -1271,9 +1271,9 @@ As an example, we give here a brief derivation of a mixture model representation analogous to Autodesk Standard Surface, from the stated material structure of OpenPBR. Following Autodesk Standard Surface, we assume here that layering is implemented via the non-reciprocal albedo-scaling of equation [non-reciprocal-albedo-scaling]. This derivation also informs how we implement our MaterialX [reference implementation](reference/open_pbr_surface.mtlx). -### Non-thin-walled case +### Non-thin-walled mode -Consider first the non-thin-walled case (i.e. **`geometry_thin_walled`** is false). +Consider first the default non-thin-walled mode (i.e. **`geometry_thin_walled`** is false). For brevity, in the following we suppress all the direction arguments, and use the notation of the tree diagram in the Model section for the weight factors i.e.: \begin{eqnarray} \mathtt{\alpha} &=& \mathtt{geometry\_opacity} \nonumber \\ @@ -1379,9 +1379,9 @@ | Diffuse reflection | $\color{darkblue}{f_\mathrm{diffuse}}$ | diffuse BRDF | as in the Glossy-diffuse section | -### Thin-walled case +### Thin-walled mode -In the thin walled case (i.e. when **`geometry_thin_walled`** is true), we will assume the approximation described in the Thin-walled case section where the coat and fuzz are ignored on the underside, and the surface always flipped to so that incident rays enter top-down. Then the derivation is the same as above except the translucent-base and subsurface slabs behave differently: +In the [thin-walled mode](index.html#model/thin-walledmode) (i.e. when **`geometry_thin_walled`** is true), the simplest approximation is to assume the coat and fuzz are ignored on the underside, and the surface always flipped so that incident rays enter top-down. Then the derivation is the same as above except the translucent-base and subsurface slabs behave differently: - The translucent-base reduces to a thin sheet of dielectric. This can just be considered the thin-wall limit of the BTDF $\color{darkblue}{f^T_\textrm{specular}}$. Note that in this limit, the reflection lobe from the dielectric $\color{darkblue}{f^R_\textrm{specular}}$ will also technically be modified due to the internal bounces in the sheet. @@ -1391,7 +1391,7 @@ ### Entering versus exiting -An aspect that has been ignored in this approximation (in the non-thin-walled case) is the different light transport for rays incident from the top or the bottom side. In reality the physical effect of the layers differs in these cases. For entering rays: +An aspect that has been ignored in this approximation (in the non-thin-walled mode) is the different light transport for rays incident from the top or the bottom side. In reality the physical effect of the layers differs in these cases. For entering rays: - The fuzz reflection is not tinted by the coat absorption. - The coat reflection is dimmed and roughened by the fuzz. @@ -1490,6 +1490,8 @@ Nicolas Wirrmann for their useful contributions. +The "shader playground" scene shown at the top of the document was authored by Nikie Monteleone. + References ============================================ From 303ead0cd9f8cb3b1a37debf4061c236432b7f11 Mon Sep 17 00:00:00 2001 From: Jamie Portsmouth Date: Mon, 2 Sep 2024 18:10:11 +0100 Subject: [PATCH 12/18] Mention that thin-film is assumed to be thinner than microfacet scale, as assumed by Belcour & Barla --- index.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index bf884a0..4bbafba 100644 --- a/index.html +++ b/index.html @@ -851,11 +851,13 @@ The coverage weight functions as a blend between the BSDF with and without the presence of the film, and thus allows one to dial the effect without altering the shape and saturation of the color fringes. - The currently recommended thin-film model is that of Belcour and Barla [#Belcour2017]. The shape and color of the fringe patterns in the reflection from the film will be affected (as described by Belcour and Barla) by the complex IOR of the adjacent media above and below the film, which in general are a statistical mix of metal and dielectric below and coat and ambient medium above (which the fuzz is index-matched to). Figure [ior_configs] illustrates the eight possible different structures depending on the presence of both the film and coat, each of which leads to different Fresnel effects due to the differing IORs at the interfaces. + The currently recommended thin-film model is that of Belcour and Barla [#Belcour2017], in which the thin-film thickness is smaller than the scale of the microfacets and assumed to be smooth. With this assumption, in practice the effect is most easily incorporated directly into the Fresnel factor of the microfacet BSDFs of both the metal and dielectric-base layers (thus it is *not* represented by incorporating an explicit thin-film Slab into the model). + + The shape and color of the fringe patterns in the reflection from the film will be affected (as described by Belcour and Barla) by the complex IOR of the adjacent media above and below the film, which in general are a statistical mix of metal and dielectric below and coat and ambient medium above (which the fuzz is index-matched to). Figure [ior_configs] illustrates the eight possible different structures depending on the presence of both the film and coat, each of which leads to different Fresnel effects due to the differing IORs at the interfaces. ![Figure [ior_configs]: Schematic of all 8 possible IOR configurations, including those involving the thin-film.](images/IOR_configs.svg width="95%" align="center") -In principle the implementation should deal with all these physical configurations correctly, though modeling of the precise effect is implementation-dependent. In practice, this wave-optics effect is most easily incorporated directly into the Fresnel factor of the microfacet BSDFs of both the metal and dielectric-base layers. (For this reason, this effect is not represented by incorporating an explicit thin-film Slab into the model). +In principle the implementation should deal with all these physical configurations correctly, though modeling of the precise effect is implementation-dependent. Note that in the case of the dielectric base, the thin-film should also generate color fringes in the transmission lobe. This is important for example when rendering soap bubbles (see [#Belcour2017]). From d060feae202e32cef1c86f27e010eabd9be9190d Mon Sep 17 00:00:00 2001 From: Jamie Portsmouth Date: Tue, 17 Sep 2024 15:02:01 +0100 Subject: [PATCH 13/18] Add acknowledgment and reference (with link) to Standard Shader Ball asset. --- index.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index 4bbafba..9292e52 100644 --- a/index.html +++ b/index.html @@ -1492,7 +1492,7 @@ Nicolas Wirrmann for their useful contributions. -The "shader playground" scene shown at the top of the document was authored by Nikie Monteleone. +The "shader playground" scene shown at the top of the document was authored by Nikie Monteleone. The shader ball used in various images is the Standard Shader Ball asset of [#Mazzone2023]. References @@ -1556,6 +1556,8 @@ [#Langlands2014]: Anders Langlands. *Physically Based Shader Design in Arnold*, ACM SIGGRAPH Talks (2014). +[#Mazzone2023]: André Mazzone and Chris Rydalch. [*Standard Shader Ball: A Modern and Feature-Rich Render Test Scene*](https://github.com/usd-wg/assets/tree/main/full_assets/StandardShaderBall), ACM SIGGRAPH Asia (2023). + [#McDermott2018]: Wes McDermott. [*The PBR Guide*](https://substance3d.adobe.com/tutorials/courses/the-pbr-guide-part-1), Allegorithmic white paper (2018). [#Neubelt13]: David Neubelt, Matt Pettineo. *Crafting a Next-Gen Material Pipeline for The Order: 1886*, ACM SIGGRAPH Courses: Physically Based Shading in Theory and Practice (2013). From 6ff0fb3d7b2be3fda4edc02ea50d08b38d96a9cb Mon Sep 17 00:00:00 2001 From: Jamie Portsmouth Date: Tue, 17 Sep 2024 15:08:11 +0100 Subject: [PATCH 14/18] Mention that exact hemispherical Fresnel albedo formula is available. --- index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/index.html b/index.html index 9292e52..39b0efa 100644 --- a/index.html +++ b/index.html @@ -1643,6 +1643,7 @@ \begin{equation} E_F(\eta) \approx \ln \biggl( \frac{10893\eta - 1438.2}{-774.4\eta^2 + 10212\eta + 1} \biggr) \ . \end{equation} +(The more complicated exact formula is also provided in [#d'Eon2021], which we do not reproduce here). Values of $E_F(\eta)$ for $\eta < 1$ are related to the values for $\eta > 1$ via: \begin{equation} E_F(\eta) = 1 - \eta^2 \bigl(1 - E_F(1/\eta)\bigr) \ . From 30293bc7bfaa4d84fe94eed082da69c2d612ac15 Mon Sep 17 00:00:00 2001 From: Jamie Portsmouth Date: Sat, 5 Oct 2024 19:59:45 +0100 Subject: [PATCH 15/18] More clear form of fuzz layering formula. --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 39b0efa..2ca7fbc 100644 --- a/index.html +++ b/index.html @@ -1099,7 +1099,7 @@ where the albedo-scaling is explicitly modified to not tint the base since the tint $\mathbf{F}$ appears only in the first term via $f_\mathrm{fuzz}$. Then accounting for the coverage weight of the fuzz layer, $\mathtt{F}$ = **`fuzz_weight`**, gives: \begin{eqnarray} -\mathrm{\mathbf{layer}}(M_\textrm{coated-base}, S_\mathrm{fuzz}, \mathtt{F}) &\rightarrow& \mathtt{F} \,f_\mathrm{fuzz} + \mathrm{lerp}\bigl(1, 1 - E_\mathrm{fuzz}, \mathtt{F}\bigr) \,f_\textrm{coated-base} \ . \label{fuzz-layering-approx} +\mathrm{\mathbf{layer}}(M_\textrm{coated-base}, S_\mathrm{fuzz}, \mathtt{F}) &\rightarrow& \mathtt{F} \,f_\mathrm{fuzz} + \bigl(1 - \mathtt{F}\,E_\mathrm{fuzz}\bigr) \,f_\textrm{coated-base} \ . \label{fuzz-layering-approx} \end{eqnarray} The fuzz shading normal is assumed to inherit from that of the substrate layer, the physical picture being that the fuzz volume settles and conforms to the geometry of the substrate. The substrate is generally a mixture of coat and uncoated base. Thus physically the fuzz model should be evaluated with each of the **`geometry_coat_normal`** and **`geometry_normal`** separately (if they differ), and the final result blended according to the **`coat_weight`**. As a practical approximation, it may be more convenient and efficient to instead approximate the fuzz normal by interpolating the coat and base normal according to **`coat_weight`**. From c3d00ba4f5327fbe1001671b9a6a134a6b91b2e2 Mon Sep 17 00:00:00 2001 From: Jamie Portsmouth Date: Thu, 17 Oct 2024 14:52:41 +0100 Subject: [PATCH 16/18] Add a clarification/reminder to clamp specular weight in the darkening calculation. --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 2ca7fbc..c37c530 100644 --- a/index.html +++ b/index.html @@ -986,7 +986,7 @@ \begin{equation} \label{dielectric_roughness_estimate} r_d = \mathrm{lerp}(1, r, \xi_s F_s) \end{equation} -while the metallic roughness can be taken to be $r_m = r$. +while the metallic roughness can be taken to be $r_m = r$. (Note that in this formula for $r_d$, a clamp must be applied to ensure that $\xi_s F_s \in [0, 1]$). Given the general formula equation [general_darkening_formula] for the darkening, a reasonable approximate scheme -- assuming no other compensation is made to approximate the effect -- is to multiply the base BSDF by the uniform _modulated darkening factor_ (taking into account the presence weight $\mathtt{C}$ = **`coat_weight`** and the darkening parameter $\delta$ = **`coat_darkening`**): \begin{equation} \label{modulated_darkening_factor} From 4987f3471316bc041a2945dcea78864c9d707432 Mon Sep 17 00:00:00 2001 From: Jamie Portsmouth Date: Tue, 12 Nov 2024 14:18:29 +0000 Subject: [PATCH 17/18] Add reference to the EON paper, remove footnote formulas. --- index.html | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/index.html b/index.html index 632c0db..a2adf5b 100644 --- a/index.html +++ b/index.html @@ -615,7 +615,7 @@ \begin{eqnarray} \label{EON_brdf} f_\mathrm{diffuse}(\omega_i, \omega_o) = f_\mathrm{ON}(\omega_i, \omega_o) + f^\mathrm{comp}_\mathrm{ON}(\omega_i, \omega_o) \ . \end{eqnarray} -This form of the Oren-Nayar model is termed "energy-preserving Oren-Nayar" or $\textbf{EON}$. +This form of the Oren-Nayar model is termed "energy-preserving Oren-Nayar" or $\textbf{EON}$ [#Portsmouth2024]. The Oren-Nayar term $f_\mathrm{ON}$ is given by the [#Fujii2012] form [^Oren_Nayar_formula] \begin{eqnarray} \label{FON_brdf} f_\mathrm{ON}(\omega_i, \omega_o) = \frac{w_\mathrm{d} \boldsymbol{\rho}}{\pi} \Bigl( A(\sigma) + B(\sigma) \frac{s}{t} @@ -627,7 +627,7 @@ The directional albedo $E_\mathrm{ON}(\omega) = w_\mathrm{d} \boldsymbol{\rho}\,\hat{E}_\mathrm{ON}(\omega)$, and corresponding _average albedo_ $\langle\hat{E}_\mathrm{ON}\rangle$, of the Oren-Nayar term can be determined -analytically [^Oren_Nayar_albedo]. The energy compensation term $f^{\mathrm{comp}}_\mathrm{ON}$ is given in terms of the +analytically [#Portsmouth2024]. The energy compensation term $f^{\mathrm{comp}}_\mathrm{ON}$ is given in terms of the albedo $\langle\hat{E}_\mathrm{ON}\rangle$ by \begin{equation} \label{EON_comp} f^\mathrm{comp}_\mathrm{ON}(\omega_i, \omega_o) = \frac{w_\mathrm{d} \boldsymbol{\rho}_\mathrm{ms}}{\pi} @@ -1576,6 +1576,8 @@ [#Polyanskiy2023]: Mikhail N. Polyanskiy. [*Refractive Index Database*](https://refractiveindex.info/) (2023). +[#Portsmouth2024]: Jamie Portsmouth, Peter Kutz and Stephen Hill. [*EON: A practical energy-preserving rough diffuse BRDF*](https://arxiv.org/abs/2410.18026) (2024) + [#Schott2023]: SCHOTT. [*Interactive Abbe Diagram*](https://www.schott.com/en-gb/interactive-abbe-diagram) (2023). [#Smythe2016]: Doug Smythe and Jonathan Stone. [*MaterialX: An Open Standard for Network-Based CG Object Looks*](https://materialx.org) @@ -1629,20 +1631,6 @@ B &=& \sigma A \ . \end{eqnarray} -[^Oren_Nayar_albedo]: The albedo of the [#Fujii2012] form of the Oren-Nayar BRDF is given by $E_\mathrm{ON}(\omega) = \rho\,\hat{E}_\mathrm{ON}(\omega)$, where -For unit $\rho$, -\begin{eqnarray} -\hat{E}_\mathrm{ON}(\omega) = A + \frac{B}{\pi} G(\omega) \ , -\end{eqnarray} -where (in spherical polars) -\begin{equation} -G(\theta) = \sin\theta \Bigl( \theta - \sin\theta \cos\theta \Bigr) + \frac{2}{3}\tan\theta \Bigl(1 - \sin^3\theta - \cos\theta\Bigr) \ . -\end{equation} -The corresponding albedo averaged over the hemisphere is given by -\begin{equation} -\langle\hat{E}_\mathrm{ON}\rangle = A + \left(\frac{2}{3} - \frac{28}{15\pi}\right) B \ . -\end{equation} - [^porosity]: In reality, coats can also darken the underlying surface due to a different mechanism where the coat modifies the Fresnel factor of the base due to the coat material filling in air gaps between granules or threads of a porous base material, which reduces the relative IORs at the internal interfaces. This occurs e.g. on adding water to sand or fabric, or adding a penetrating wood finish. We assume here that this effect explicitly does _not_ occur, at present, since we do not have enough knowledge about the properties of the underlying substance to model it. We can only safely assume that the first mechanism of darkening, i.e. internal reflections, occurs. [^avg_fresnel]: The hemispherical (or average) albedo of the Fresnel factor is defined as $E_F(\eta) \equiv 2 \int_0^1 F(\mu, \eta)\,\mu\,\mathrm{d}\mu$. This can be tabulated, or one can use the convenient analytical approximation [#d'Eon2021] (accurate to within 0.2% in the limited range $\eta \in [1,3]$): From e5fa4788637a1dc93b5ae83c999eb27997a95374 Mon Sep 17 00:00:00 2001 From: Jamie Portsmouth Date: Tue, 12 Nov 2024 14:20:01 +0000 Subject: [PATCH 18/18] add period --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 5b71592..ebba2d2 100644 --- a/index.html +++ b/index.html @@ -1576,7 +1576,7 @@ [#Polyanskiy2023]: Mikhail N. Polyanskiy. [*Refractive Index Database*](https://refractiveindex.info/) (2023). -[#Portsmouth2024]: Jamie Portsmouth, Peter Kutz and Stephen Hill. [*EON: A practical energy-preserving rough diffuse BRDF*](https://arxiv.org/abs/2410.18026) (2024) +[#Portsmouth2024]: Jamie Portsmouth, Peter Kutz and Stephen Hill. [*EON: A practical energy-preserving rough diffuse BRDF*](https://arxiv.org/abs/2410.18026) (2024). [#Schott2023]: SCHOTT. [*Interactive Abbe Diagram*](https://www.schott.com/en-gb/interactive-abbe-diagram) (2023).