Skip to content

Commit b212785

Browse files
Merge v1.1 development to main (#222)
This changelist merges v1.1 development from dev_1.1 to main, in preparation for marking the release of OpenPBR v1.1.
1 parent 44fe766 commit b212785

File tree

6 files changed

+24
-21
lines changed

6 files changed

+24
-21
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ OpenPBR Surface is an open standard hosted by the [Academy Software Foundation](
1818
* **[Reference implementation](reference/open_pbr_surface.mtlx)** – written in [MaterialX](https://materialx.org/)
1919
* **[BibTeX citation](openpbr.bib)**
2020

21+
### Resources
22+
23+
* [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
24+
* [OpenPBR-viewer](https://github.com/portsmouth/OpenPBR-viewer) - self-contained example implementation in a WebGL pathtracer (run [here](https://portsmouth.github.io/OpenPBR-viewer))
25+
* [#openpbr](https://academysoftwarefdn.slack.com/channels/openpbr) - public Slack channel for discussions, hosted by ASWF
26+
2127
<br/>
2228

2329
[![License: CC BY-SA 4.0](https://img.shields.io/badge/License-Apache%202.0-informational.svg)](LICENSE)

examples/open_pbr_default.mtlx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<input name="transmission_scatter" type="color3" value="0, 0, 0" />
2121
<input name="transmission_scatter_anisotropy" type="float" value="0.0" />
2222
<input name="transmission_dispersion_scale" type="float" value="0.0" />
23-
<input name="transmission_dispersion_abbe_number" type="float" value="0.0" />
23+
<input name="transmission_dispersion_abbe_number" type="float" value="20.0" />
2424
<input name="subsurface_weight" type="float" value="0" />
2525
<input name="subsurface_color" type="color3" value="0.8, 0.8, 0.8" />
2626
<input name="subsurface_radius" type="float" value="1.0" />
@@ -35,9 +35,9 @@
3535
<input name="coat_roughness_anisotropy" type="float" value="0.0" />
3636
<input name="coat_ior" type="float" value="1.6" />
3737
<input name="coat_darkening" type="float" value="1.0" />
38-
<input name="thin_film_weight" type="float" value="0.0" />
39-
<input name="thin_film_thickness" type="float" value="0" />
40-
<input name="thin_film_ior" type="float" value="1.5" />
38+
<input name="thin_film_weight" type="float" value="0" />
39+
<input name="thin_film_thickness" type="float" value="0.5" />
40+
<input name="thin_film_ior" type="float" value="1.4" />
4141
<input name="emission_luminance" type="float" value="0.0" />
4242
<input name="emission_color" type="color3" value="1, 1, 1" />
4343
<input name="geometry_opacity" type="float" value="1" />

examples/open_pbr_velvet.mtlx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88
<input name="specular_roughness" type="float" value="0.8" />
99
<input name="fuzz_weight" type="float" value="1" />
1010
<input name="fuzz_color" type="color3" value="0.4, 0.4, 0.4" />
11-
<input name="fuzz_roughness" type="float" value="0.2" />
11+
<input name="fuzz_roughness" type="float" value="0.5" />
1212
</open_pbr_surface>
1313
</materialx>

index.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
**OpenPBR Surface**
66

7-
<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>
7+
<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>
88

99
<br>
1010
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.
@@ -750,7 +750,7 @@
750750
**`subsurface_weight`** | Weight | `float` | $ [0, 1] $ | | $ 0 $ | Mix weight between subsurface and diffuse slabs
751751
**`subsurface_color`** | Color | `color3` | $ [0, 1] $ | | $ (0.8, 0.8, 0.8) $ | The observed reflection color of $V^\infty_\mathrm{subsurface}$
752752
**`subsurface_radius`** | Radius | `float` | $ [0, \infty) $ | $ [0, 1] $ | $ 1 $ | Length scale of MFP
753-
**`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
753+
**`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
754754
**`subsurface_scatter_anisotropy`** | Anisotropy | `float` | $ [-1, 1] $ | | $ 0 $ | Anisotropy of the Henyey--Greenstein phase function of the interior medium $V^\infty_\mathrm{subsurface}$
755755

756756
![](images/subsurface1.jpg width=99%) ![](images/subsurface2.jpg width=99%) ![](images/subsurface3.jpg width=99%)
@@ -868,7 +868,7 @@
868868
--------------------------|-----------|----------|:---------------:|:-------------:|:--------:|----------------------------------------------
869869
**`thin_film_weight`** | Weight | `float` | $ [0, 1] $ | | $ 0 $ | Coverage weight of the thin film
870870
**`thin_film_thickness`** | Thickness | `float` | $ [0, \infty) $ | $ [0, 1] $ | $ 0.5 $ | Thickness of the film in micrometers ($\mathrm{\mu m}$)
871-
**`thin_film_ior`** | IOR | `float` | $ (0, \infty) $ | $ [1, 3] $ | $ 1.5 $ | Refractive index of the film
871+
**`thin_film_ior`** | IOR | `float` | $ (0, \infty) $ | $ [1, 3] $ | $ 1.4 $ | Refractive index of the film
872872

873873
![](images/thin_film_0nm.png width=99%) ![](images/thin_film_300nm.png width=99%) ![](images/thin_film_600nm.png width=99%)
874874
<div class="shifted-caption">
@@ -1074,7 +1074,7 @@
10741074

10751075
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:
10761076

1077-
- 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.
1077+
- 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.
10781078
- 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.
10791079
- 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.
10801080

@@ -1128,7 +1128,7 @@
11281128
* +-------------------------------------------------+ *
11291129
*******************************************************
11301130

1131-
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).
1131+
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).
11321132

11331133
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.
11341134

parametrization.md.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
| `subsurface_weight` | Weight | `float` | $ [0, 1] $ | | $ 0 $ | |
4545
| `subsurface_color` | Color | `color3` | $ [0, 1] $ | | $ (0.8, 0.8, 0.8) $ | |
4646
| `subsurface_radius` | Radius | `float` | $ [0, \infty) $ | $ [0, 1] $ | $ 1 $ | length |
47-
| `subsurface_radius_scale` | Radius scale | `vector3` | $ [0, 1]^3 $ | | $ (1.0, 0.5, 0.25) $ | |
47+
| `subsurface_radius_scale` | Radius scale | `color3` | $ [0, 1]^3 $ | | $ (1.0, 0.5, 0.25) $ | |
4848
| `subsurface_scatter_anisotropy` | Anisotropy | `float` | $ [-1, 1] $ | | $ 0 $ | |
4949
| **Coat** |
5050
| `coat_weight` | Weight | `float` | $ [0, 1] $ | | $ 0 $ | |
@@ -63,7 +63,7 @@
6363
| **Thin-film** |
6464
| `thin_film_weight` | Weight | `float` | $ [0, 1] $ | | $ 0 $ | |
6565
| `thin_film_thickness` | Thickness | `float` | $ [0, \infty) $ | $ [0, 1] $ | $ 0.5 $ | $\mathrm{\mu m}$ |
66-
| `thin_film_ior` | IOR | `float` | $ (0, \infty) $ | $ [1, 3] $ | $ 1.5 $ | |
66+
| `thin_film_ior` | IOR | `float` | $ (0, \infty) $ | $ [1, 3] $ | $ 1.4 $ | |
6767
| **Geometry** |
6868
| `geometry_opacity` | Opacity | `float` | $ [0, 1] $ | | $ 1 $ | |
6969
| `geometry_thin_walled` | Thin walled | `boolean` | {false, true} | | false | |

reference/open_pbr_surface.mtlx

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<!--
44
OpenPBR Surface node definition
55
-->
6-
<nodedef name="ND_open_pbr_surface_surfaceshader" node="open_pbr_surface" nodegroup="pbr" version="1.0" isdefaultversion="true"
6+
<nodedef name="ND_open_pbr_surface_surfaceshader" node="open_pbr_surface" nodegroup="pbr" version="1.1" isdefaultversion="true"
77
doc="OpenPBR Surface Shading Model" uiname="OpenPBR Surface">
88
<input name="base_weight" type="float" value="1.0" uimin="0.0" uimax="1.0" uiname="Base Weight" uifolder="Base"
99
doc="Multiplier on the intensity of the reflection from the diffuse and metallic base." />
@@ -69,7 +69,7 @@
6969
doc="Coverage weight of the thin-film. Use for materials such as multi-tone car paint or soap bubbles." />
7070
<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"
7171
doc="The thickness of the thin-film layer on the base (in micrometers)." />
72-
<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"
72+
<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"
7373
doc="The index of refraction of the thin-film." />
7474
<input name="emission_luminance" type="float" value="0.0" uimin="0.0" uisoftmax="1000.0" uiname="Emission Luminance" uifolder="Emission"
7575
doc="The amount of emitted light, as a luminance in nits." />
@@ -177,16 +177,13 @@
177177
</mix>
178178

179179
<!-- Subsurface (non-thin-walled) -->
180-
<convert name="subsurface_radius_vector" type="vector3">
181-
<input name="in" type="color3" interfacename="subsurface_radius_scale" />
182-
</convert>
183-
<multiply name="subsurface_radius_scaled" type="vector3">
184-
<input name="in1" type="vector3" nodename="subsurface_radius_vector" />
180+
<multiply name="subsurface_radius_scaled" type="color3">
181+
<input name="in1" type="color3" interfacename="subsurface_radius_scale" />
185182
<input name="in2" type="float" interfacename="subsurface_radius" />
186183
</multiply>
187184
<subsurface_bsdf name="subsurface_bsdf" type="BSDF">
188185
<input name="color" type="color3" nodename="subsurface_color_nonnegative" />
189-
<input name="radius" type="vector3" nodename="subsurface_radius_scaled" />
186+
<input name="radius" type="color3" nodename="subsurface_radius_scaled" />
190187
<input name="anisotropy" type="float" interfacename="subsurface_scatter_anisotropy" />
191188
<input name="normal" type="vector3" interfacename="geometry_normal" />
192189
</subsurface_bsdf>
@@ -558,12 +555,12 @@
558555
</layer>
559556

560557
<!-- Fuzz Layer -->
561-
<!-- TODO: Add a new BSDF node for the selected fuzz model in OpenPBR -->
562558
<sheen_bsdf name="fuzz_bsdf" type="BSDF">
563559
<input name="weight" type="float" interfacename="fuzz_weight" />
564560
<input name="color" type="color3" interfacename="fuzz_color" />
565561
<input name="roughness" type="float" interfacename="fuzz_roughness" />
566562
<input name="normal" type="vector3" interfacename="geometry_normal" />
563+
<input name="mode" type="string" value="zeltner" />
567564
</sheen_bsdf>
568565
<layer name="fuzz_layer" type="BSDF">
569566
<input name="top" type="BSDF" nodename="fuzz_bsdf" />

0 commit comments

Comments
 (0)