Skip to content

Commit

Permalink
Merge v1.1 development to main (#222)
Browse files Browse the repository at this point in the history
This changelist merges v1.1 development from dev_1.1 to main, in preparation for marking the release of OpenPBR v1.1.
  • Loading branch information
jstone-lucasfilm authored Jun 28, 2024
1 parent 44fe766 commit b212785
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 21 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

<br/>

[![License: CC BY-SA 4.0](https://img.shields.io/badge/License-Apache%202.0-informational.svg)](LICENSE)
8 changes: 4 additions & 4 deletions examples/open_pbr_default.mtlx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
<input name="transmission_scatter" type="color3" value="0, 0, 0" />
<input name="transmission_scatter_anisotropy" type="float" value="0.0" />
<input name="transmission_dispersion_scale" type="float" value="0.0" />
<input name="transmission_dispersion_abbe_number" type="float" value="0.0" />
<input name="transmission_dispersion_abbe_number" type="float" value="20.0" />
<input name="subsurface_weight" type="float" value="0" />
<input name="subsurface_color" type="color3" value="0.8, 0.8, 0.8" />
<input name="subsurface_radius" type="float" value="1.0" />
Expand All @@ -35,9 +35,9 @@
<input name="coat_roughness_anisotropy" type="float" value="0.0" />
<input name="coat_ior" type="float" value="1.6" />
<input name="coat_darkening" type="float" value="1.0" />
<input name="thin_film_weight" type="float" value="0.0" />
<input name="thin_film_thickness" type="float" value="0" />
<input name="thin_film_ior" type="float" value="1.5" />
<input name="thin_film_weight" type="float" value="0" />
<input name="thin_film_thickness" type="float" value="0.5" />
<input name="thin_film_ior" type="float" value="1.4" />
<input name="emission_luminance" type="float" value="0.0" />
<input name="emission_color" type="color3" value="1, 1, 1" />
<input name="geometry_opacity" type="float" value="1" />
Expand Down
2 changes: 1 addition & 1 deletion examples/open_pbr_velvet.mtlx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@
<input name="specular_roughness" type="float" value="0.8" />
<input name="fuzz_weight" type="float" value="1" />
<input name="fuzz_color" type="color3" value="0.4, 0.4, 0.4" />
<input name="fuzz_roughness" type="float" value="0.2" />
<input name="fuzz_roughness" type="float" value="0.5" />
</open_pbr_surface>
</materialx>
10 changes: 5 additions & 5 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

**OpenPBR Surface**

<center>*Specification v1.0, 2024-06-04. &nbsp; &nbsp; <a href="https://github.com/AcademySoftwareFoundation/OpenPBR" title="Redirect to GitHub page"><img src="images/aswf-logo-black.svg" alt="homepage" height="18" style="vertical-align: middle; position: relative; bottom: 3px"/></a> *</center>
<center>*Specification v1.1, 2024-06-28. &nbsp; &nbsp; <a href="https://github.com/AcademySoftwareFoundation/OpenPBR" title="Redirect to GitHub page"><img src="images/aswf-logo-black.svg" alt="homepage" height="18" style="vertical-align: middle; position: relative; bottom: 3px"/></a> *</center>

<br>
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.
Expand Down Expand Up @@ -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%)
Expand Down Expand Up @@ -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%)
<div class="shifted-caption">
Expand Down Expand Up @@ -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.

Expand Down Expand Up @@ -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.

Expand Down
4 changes: 2 additions & 2 deletions parametrization.md.html
Original file line number Diff line number Diff line change
Expand Up @@ -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 $ | |
Expand All @@ -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 | |
Expand Down
15 changes: 6 additions & 9 deletions reference/open_pbr_surface.mtlx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<!--
OpenPBR Surface node definition
-->
<nodedef name="ND_open_pbr_surface_surfaceshader" node="open_pbr_surface" nodegroup="pbr" version="1.0" isdefaultversion="true"
<nodedef name="ND_open_pbr_surface_surfaceshader" node="open_pbr_surface" nodegroup="pbr" version="1.1" isdefaultversion="true"
doc="OpenPBR Surface Shading Model" uiname="OpenPBR Surface">
<input name="base_weight" type="float" value="1.0" uimin="0.0" uimax="1.0" uiname="Base Weight" uifolder="Base"
doc="Multiplier on the intensity of the reflection from the diffuse and metallic base." />
Expand Down Expand Up @@ -69,7 +69,7 @@
doc="Coverage weight of the thin-film. Use for materials such as multi-tone car paint or soap bubbles." />
<input name="thin_film_thickness" type="float" value="0.5" uimin="0.0" uisoftmax="1.0" uiname="Thin Film Thickness" uifolder="Thin Film" uiadvanced="true"
doc="The thickness of the thin-film layer on the base (in micrometers)." />
<input name="thin_film_ior" type="float" value="1.5" uimin="0.0" uisoftmin="1.0" uisoftmax="3.0" uiname="Thin Film Index of Refraction" uifolder="Thin Film" uiadvanced="true"
<input name="thin_film_ior" type="float" value="1.4" uimin="0.0" uisoftmin="1.0" uisoftmax="3.0" uiname="Thin Film Index of Refraction" uifolder="Thin Film" uiadvanced="true"
doc="The index of refraction of the thin-film." />
<input name="emission_luminance" type="float" value="0.0" uimin="0.0" uisoftmax="1000.0" uiname="Emission Luminance" uifolder="Emission"
doc="The amount of emitted light, as a luminance in nits." />
Expand Down Expand Up @@ -177,16 +177,13 @@
</mix>

<!-- Subsurface (non-thin-walled) -->
<convert name="subsurface_radius_vector" type="vector3">
<input name="in" type="color3" interfacename="subsurface_radius_scale" />
</convert>
<multiply name="subsurface_radius_scaled" type="vector3">
<input name="in1" type="vector3" nodename="subsurface_radius_vector" />
<multiply name="subsurface_radius_scaled" type="color3">
<input name="in1" type="color3" interfacename="subsurface_radius_scale" />
<input name="in2" type="float" interfacename="subsurface_radius" />
</multiply>
<subsurface_bsdf name="subsurface_bsdf" type="BSDF">
<input name="color" type="color3" nodename="subsurface_color_nonnegative" />
<input name="radius" type="vector3" nodename="subsurface_radius_scaled" />
<input name="radius" type="color3" nodename="subsurface_radius_scaled" />
<input name="anisotropy" type="float" interfacename="subsurface_scatter_anisotropy" />
<input name="normal" type="vector3" interfacename="geometry_normal" />
</subsurface_bsdf>
Expand Down Expand Up @@ -558,12 +555,12 @@
</layer>

<!-- Fuzz Layer -->
<!-- TODO: Add a new BSDF node for the selected fuzz model in OpenPBR -->
<sheen_bsdf name="fuzz_bsdf" type="BSDF">
<input name="weight" type="float" interfacename="fuzz_weight" />
<input name="color" type="color3" interfacename="fuzz_color" />
<input name="roughness" type="float" interfacename="fuzz_roughness" />
<input name="normal" type="vector3" interfacename="geometry_normal" />
<input name="mode" type="string" value="zeltner" />
</sheen_bsdf>
<layer name="fuzz_layer" type="BSDF">
<input name="top" type="BSDF" nodename="fuzz_bsdf" />
Expand Down

0 comments on commit b212785

Please sign in to comment.