Skip to content

Latest commit

 

History

History
1378 lines (1016 loc) · 142 KB

File metadata and controls

1378 lines (1016 loc) · 142 KB

OpenPBR Surface specification

Zap Andersson, Paul Edmondson, Julien Guertault, Adrien Herubel, Alan King, Peter Kutz, Andréa Machizaud, Jamie Portsmouth, Frédéric Servant. *Version 0.2, 2023-10-19. A joint work of Adobe and Autodesk*

This document is a specification of a surface shading model: the OpenPBR Surface model. Designed as an über-surface, 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.

Historical background and objectives

Interchange of computer graphics scene assets remains a significant problem, especially with regard to surface appearance. Different renderers and 3D engines use different shading systems, shading languages, and fixed-function pipelines which are not easily interoperable. Furthermore, accurately modeling surface appearance remains a complex and pertinent problem and is a topic of active scientific research. Despite this, there is a strong need today for industries engaged in physically based rendering (both offline and real-time) to find a standardized material model that covers the most common use cases in typical workflows.

Over the years, certain de facto standard appearance definition frameworks have emerged as different vendors have come to the consensus of separating the definition of materials from the light transport simulation in the scene. Such general frameworks include MaterialX [#Smythe2016], Open Shading Language (OSL) [#Gritz2010], and Material Definition Language (MDL) [#Kettner2015], which allow specifying the material as a combination of primitive surface reflectance models. These frameworks alone however are not sufficient for look development by end users, who should not be expected to build complex surface shaders from the ground up for routine tasks. Instead it is much more convenient in practice for them to work with a standard über-shader parametrization, i.e. a single monolithic material definition covering a wide range of cases, with a well-defined set of parameters that can be tweaked to represent most real-world (as well as imaginary) materials.

There have been various previous proposals for such an über-shader, such as Disney's Principled Shader [#Burley2012], Allegorithmic's PBR shading model [#McDermott2018], and most recently the Autodesk Standard Surface shader [#Georgiev2019] and the Adobe Standard Material [#Kutz2021]. Autodesk Standard Surface has strong spiritual predecessors in Anders Langlands' alSurface [#Langlands2014] and Autodesk 3ds Max's Physical Material [#Andersson2016]. 3ds Max's Physical Material in turn was strongly inspired by Allegorithmic's model, Disney's Principled Shader, and general industry trends in several real-time 3D engines.

However each of these models originated from a single company and was designed primarily for the needs of that company's particular software products and customers. There is thus a need for a specification which is developed as a collaboration between all the significant players in the industry, as an open standard, which is flexible enough to accommodate the common use cases industry-wide. It should incorporate the experience of artists, software developers, and product managers as to what is genuinely useful in production. To this end, the model defined in this spec has been developed as a collaboration between Autodesk and Adobe, with input from multiple other industry partners. It is an open standard hosted by the Academy Software Foundation (ASWF).

OpenPBR is intended to be a common interface between products, as well as something practical that works well and looks plausible for most day-to-day use cases. For the more specialized use cases it does not cover (for example very high-end skin, hair, cloth or volume shading), one may need to use a renderer-specific shader, or build a bespoke shading network. We aim for the overall behavior to be simple, logical, intuitive, and understandable, so that users can become comfortable and familiar with it, while also being grounded in physically-based rendering.

We thus adopt a specific form of material structure that has proved useful as a general purpose model in media and entertainment (Figure [diagram_model]). In outline the structure consists of:

  • A base substrate made of a mixture of metal or dielectric. The interface (dielectric or metal) of this base layer produces the primary specular reflection lobe. The dielectric base represents either of three components, that can be statistically mixed:
    1. Glossy-diffuse: dielectric with opaque internal media, e.g. wood, granite, concrete, cardboard, and wall-paint.
    2. Subsurface: dielectric with dense highly scattering internal media, e.g. plastic, marble, skin, vegetation, and food.
    3. Translucent-base: dielectric with translucent internal media, e.g. glass, crystals, and liquids.
  • Coat: An optional layer of dielectric, which may have an absorbing medium, acting as a coating on top of the base substrate. The dielectric interface of this coat layer provides a secondary specular lobe.
  • Fuzz: An optional layer representing the reflection from micro-fibers (such as fine hair, peach fuzz, textile strands, and dust grains) on top of everything else.

![Figure [diagram_model]: Schematic illustration of the idealized physical material that our shader models. Horizontal stacking of slabs represents statistical mixture and vertical stacking represents layering.](images/model_schematic.svg width="100%")

We define this physical material structure in detail using a simple formalism involving slabs of material composed via layering and mixing operations. This formalism is general enough to describe arbitrarily complex materials, but we restrict its usage here to defining the particular material structure illustrated above.

Unlike previous models such as Autodesk Standard Surface [#Georgiev2019], we define the model by describing the physical structure as unambiguously as possible, rather than by specifying a particular form of implementation. At the level of computer graphics, the model is completely physically specified if the BSDF (Bidirectional Scattering Distribution Function) of each slab interface, and the volumetric properties of each slab medium, are specified. The ground truth appearance of the model is then defined to be given by the BSDF obtained by physical light transport through the whole structure of component slabs. Implementations thus have an unambiguous goal appearance which they can reason about and approximate logically, to a greater or lesser degree of fidelity, on the basis of physics and light transport. The closer an implementation is to reproducing this ground truth physical appearance, the better it conforms to the specification.

For each component slab of the structure, we define a set of artistically intuitive parameters which control the underlying physical properties, and describe in detail how the properties are determined from the parameters. Rather than providing parameters for every conceivable case, we intentionally try to boil the set of parameters down to only those that are most useful in practice. The parameters are designed to be intuitive but also to ensure that the users work within the bounds of what is physically plausible as much as possible. See the Parameter reference section for the complete list.

Formalism

The light scattering characteristics at the surfaces of basic materials like metal, glass, or wall paint are well studied and can be accurately represented via simple analytical models. Other materials, such as finished wood, cloth, or skin, comprise semi-transparent layers of matter stacked on top of each other. The more intricate behavior of such materials is the result of light scattering at the interfaces between these layers and propagating through them. Materials are also heterogeneous across the surface, for example a rusty metal surface has regions with bare specular metal and dull iron oxide, and the transition between these materials may be abrupt or a smooth blend.

To model such materials, we introduce a simple formalism which describes an abstraction consisting of slabs of homogeneous dielectric or conductor, bounded by well-defined BSDFs. Two basic operations on these slabs — layering and statistical mixing — then provide a formal language for constructing a well-defined physical material model.

Slabs

Each slab consists of a homogeneous dielectric or conducting medium $V$ with conceptually unbounded extent horizontally and a finite vertical extent, bounded above by a surface with a given interface BSDF $f$. We denote a general slab therefore as follows: \begin{equation} \quad S = \mathrm{Slab}(f, V) \end{equation} where $f$ is the interface BSDF and $V$ is the medium VDF (as defined below). To clarify the relationships, we represent slabs diagrammatically in a block form as follows:


  • +-----------------+ f *
  • | | *
  • | V | *
  • | | *
  • +-----------------+ *

We work in the local space of a 2d surface, so horizontal refers to directions in the local plane, and vertical means aligned with the outward shading normal. The direction towards the top of the material is understood to align with the local shading normal at the current light transport vertex. In order to make the light transport tractable we consider that on the mesoscopic scale of the depth of the slabs in the structure, the slabs are locally homogeneous. On a larger macroscopic scale, the properties of the slabs, and the overall structure of the material, will vary over the surface.

We do not dictate how the surfaces of the slab are described physically at the microscopic level, but at the level of the mesoscopic slab description they are flat interfaces with a known BSDF. We will be as specific as possible about the chosen functional form of the BSDFs, though in most cases we refer to the literature for the full details of the implementation. The BSDFs are mostly microfacet models (apart from the fuzz BSDF which derives from microflake theory).

Each BSDF is a function of input and output directions $f(\omega_i, \omega_o)$ where, following the usual convention, these both point away from the surface vertex with $\omega_o$ in the direction of the outgoing light and $\omega_i$ opposite to the direction of the incident light. Physically the BSDF should be energy conserving and reciprocal. Energy conservation of a BRDF 1 $f(\omega_i, \omega_o)$ amounts to the requirement that the directional reflectance (or albedo) $E(\omega_o) \le 1$ for all output ray directions, where $E(\omega_o)$ is defined as the integral of the BRDF over directions in the same hemisphere $\mathcal{H}+$ as $\omega_o$ with projected solid angle measure: \begin{equation} \label{energy-conservation} E(\omega_o) \equiv \int{\mathcal{H}+} f(\omega_i, \omega_o) ,\mathrm{d}\omega^\perp_i \ . \end{equation} More generally, for transmissive BSDFs there is a similar constraint $E(\omega_o) + T(\omega_o)\le 1$ where the directional transmittance $T(\omega_o)$ is defined by integrating the BSDF over the opposite hemisphere $\mathcal{H}-$ to $\omega_o$. All BSDFs used are energy conserving in this sense. A BSDF which in addition does not dissipate any energy, such as a dielectric interface or a diffuse surface with a white albedo, is said to be energy-preserving and satisfies $E(\omega_o) + T(\omega_o) = 1$.

Reciprocity 2 is the requirement that the BSDF is symmetric under interchange of the arguments, i.e. $\omega_i \leftrightarrow \omega_o$. In some cases this is relaxed and a non-reciprocal BSDF used for simplicity or efficiency, as in practice it does not lead to serious issues.

If the slab is completely opaque (e.g. conducting or diffuse) we need only specify the surface BSDF $f$, as the interior medium is irrelevant for light transport. If the slab is non-opaque, i.e. translucent, the interior medium $V$ of the slab is taken to be a homogeneous dielectric which optionally contains a specified homogeneous volumetric medium (or "VDF"). By VDF we mean the set of quantities (in general spatially varying fields) which define a volumetric optical medium, i.e.

  • the normalized phase function parameters
  • the absorption and scattering coefficients (alternatively, extinction coefficient and scattering albedo)
  • the index of refraction (IOR) and dispersion of the embedding dielectric medium

We assume that the renderer is aware that the volumetric properties may vary from point to point, inherited from the surface parameters, and how the fields are "filled-in" in the space surrounding the surfaces is a matter for implementations to deal with.

The medium $V$ either specifies its own depth, or is a semi-infinite "bulk" volumetric medium at the bottom of the structure. We denote such a bulk medium conceptually unbounded below as $V^\infty$. This is an abstraction of course, where we understand that such a semi-infinite medium actually just represents the bottom layer of the local surface structure. The medium will most likely terminate somewhere but remote from the surface on the mesoscopic scale. Note that the BSDF of the bottom interface of a slab $S$ of finite depth does not need to be specified, as it will be derivable from the BSDF of the underlying slab in combination with the properties of the medium of $S$ (as discussed in the Layering section).

If the bounding BSDFs of a slab are completely non-transmissive and opaque (e.g. metallic or diffuse), the internal medium is irrelevant for light transport purposes. For convenience, it can be omitted: \begin{equation} S_\mathrm{opaque} = \mathrm{Slab}(f) \ . \end{equation}


  • +-----------------+ f *
  • |░░░░░░░░░░░░░░░░░| *
  • |░░░░░░░░░░░░░░░░░| *
  • |░░░░░░░░░░░░░░░░░| *
  • +- - - - - - - - -+ *

A semi-infinite slab at the bottom of the material structure is denoted with a bulk medium $V^\infty$ which has no bottom interface: \begin{equation} S_\mathrm{bulk} = \mathrm{Slab}(f, V^\infty) \ . \end{equation}


  • +-----------------+ f *
  • | | *
  • | V∞ | *
  • | | *
  • +- - - - - - - - -+ *

For completeness, the absence of a slab (i.e. no surface or underlying medium), which corresponds just to the ambient dielectric medium, is denoted $\mathrm{Slab}(\emptyset)$.

A slab does not itself specify anything about other slabs in relation to itself (e.g. its substrate slab or overlying slab). The adjacent medium above and below the slab will depend on where it sits in the eventual layer structure. The ambient dielectric medium of the very top of the entire structure (and bottom if thin-walled) is also assumed to be given and unspecified by the model. If the renderer keeps track of the dielectric medium in which the surface is embedded (via a scheme such as "nested dielectrics" [#Budge2002]) which may be the interior dielectric bulk of some transparent object in the scene such as a piece of glass or body of water, then the surrounding ambient medium is a dielectric whose IOR we denote ambient_ior, or if dielectric medium tracking is not done then ambient_ior can be assumed to be 1 corresponding to air or vacuum.

Given constituent slabs, we then build a more complex composite material by "vertically" layering and "horizontally" mixing slabs, as described below.

Layering

The layer operation generates a composite material by depositing a slab $S_\mathrm{coat} = \mathrm{Slab}(f_\mathrm{coat}, V_\mathrm{coat})$ on top of another substrate slab $S_\mathrm{sub} = \mathrm{Slab}(f_\mathrm{sub}, V_\mathrm{sub})$ or composite material, conceptually bonding the base of $S_\mathrm{coat}$'s dielectric medium to the surface of $S_\mathrm{sub}$, so that $V_\mathrm{coat}$ becomes the adjacent medium to the top interface of $S_\mathrm{sub}$.

The physical act of bringing the two independent slabs $S_\mathrm{sub}$ and $S_\mathrm{coat}$ together and bonding them produces a new composite material $L$ which is "vertically" heterogeneous on the mesoscopic scale, denoted by: \begin{equation} L = \mathrm{\mathbf{layer}}(S_\mathrm{sub}, S_\mathrm{coat}) \ . \end{equation}

Diagrammatically, we represent the layering operation as putting the two slabs vertically adjacent, where one is to imagine the physical slabs of material being bonded at their top and bottom interfaces.


  •                                                                                       *
    
  •     +-----------------+ fcoat                                                         *
    
  •     |                 |                                                               *
    
  • Scoat | Vcoat | +-----------------+ fcoat *
  •     |                 |                              |                 |              *
    
  •     +-----------------+                              |      Vcoat      |              *
    
  •              ^                  layer(Ssub, Scoat)   |                 |              *
    
  •              | bond               ------------>      +-----------------+ f'sub        *
    
  •              v                                       |                 |              *
    
  •     +-----------------+ fsub                         |      Vsub       |              *
    
  •     |                 |                              |                 |              *
    
  • Ssub | Vsub | +-----------------+ *
  •     |                 |                                                               *
    
  •     +-----------------+                                                               *
    
  •                                                                                       *
    

It is understood that the BSDF $f^\prime_\mathrm{sub}$ at the new internal interface formed from the joining of the coat and substrate slabs is not necessarily the same as $f_\mathrm{sub}$, but would be derivable from it by considering the physics and geometry of the bond. Physically this BSDF should be consistent with the adjacent media $V_\mathrm{coat}$ and $V_\mathrm{sub}$, and it is assumed that the bond does not significantly alter the geometry of the substrate interface (i.e. the coat conforms to the substrate geometry). It is then reasonably unambiguous how the BSDF of the internal interface should be implemented, taking into account the known BSDFs and media of the component slabs being bonded in the layering and the final suite of parameters which is supposed to describe the resultant interface. For example bringing two dielectric slabs together produces well-understood Fresnel effects at the interface according to the ratio of the IORs of the dielectric media.

Note that technically, the $\mathrm{\mathbf{layer}}$ operator is associative, i.e. \begin{equation} \mathrm{\mathbf{layer}}(S_a, \mathrm{\mathbf{layer}}(S_b, S_c)) = \mathrm{\mathbf{layer}}(\mathrm{\mathbf{layer}}(S_a, S_b), S_c) \end{equation} since these describe equivalent physical configurations.

The mapping from the physical layer structure into a form usable within a renderer depends on the level of approximation which is desired for the specific use-case. Typically the light transport properties will be represented by BSDFs representing the various lobes generated by the model, which we can roughly identify with the BSDFs of the top interfaces of each slab. Then the resultant BSDF of the layering operation can be approximated via various schemes which combine the BSDFs of the individual interfaces.

For example given the general situation described above of a dielectric coat slab layered on a substrate slab, denoted $\mathrm{\mathbf{layer}}(S_\mathrm{sub}, S_\mathrm{coat})$, this produces an internal interface with some derivable BSDF $f_\mathrm{sub}$ and dielectric top interface with BSDF $f_\mathrm{coat}$ sandwiching the dielectric coat medium $V_\mathrm{coat}$.


  • +-----------------+ fcoat *
  • | | *
  • | Vcoat | *
  • | | *
  • +-----------------+ fsub *
  • | | *

The simplest representation of this layer configuration would amount to some linear combination of the interface BSDFs $f_\mathrm{sub}$ and $f_\mathrm{coat}$. A common approach is the so-called albedo-scaling approximation, where the total BSDF of this layered configuration is given by summing $f_\mathrm{coat}$ and $f_\mathrm{sub}$ with the substrate lobe weighted with a factor equal to one minus the directional reflectance of the coat, which is designed to ensure that the resulting BSDF is energy conserving: \begin{equation} \label{non-reciprocal-albedo-scaling} f_\mathrm{layer}(\omega_i, \omega_o) = f_\mathrm{coat}(\omega_i, \omega_o) + \bigl(1 - E_\mathrm{coat}(\omega_o)\bigr) ,f_\mathrm{sub}(\omega_i, \omega_o) \end{equation} where the directional albedo integral $E_\mathrm{coat}(\omega_o)$ can be either precomputed and tabulated, or computed on-the-fly via Monte Carlo sampling of the BSDF. This form ensures that if the directional albedos of the coat and substrate BSDFs are energy conserving (i.e. $E_\mathrm{coat}(\omega_o) \le 1$, $E_\mathrm{sub}(\omega_o) \le 1$), then the combined BSDF is also energy conserving, since \begin{equation} E_\mathrm{layer}(\omega_o) ,=, E_\mathrm{coat}(\omega_o) + \bigl(1 - E_\mathrm{coat}(\omega_o)\bigr) ,E_\mathrm{sub}(\omega_o) ;; \le , 1 \ . \end{equation} 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 \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) \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.

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.

Mixing

Many real-world objects are made of several different materials arranged in patches, e.g. metal and oxide regions on a rusty object, and it is convenient to model the appearance of such objects by texturing the type of each material on their surfaces. While the material transitions are typically abrupt in reality, the ability to continuously mix materials is useful for artistic purposes as well as for anti-aliasing.

The mix operation models this as a linear blend between two materials at the mesoscopic level. The physical picture is that the mesosurface consists of randomly distributed patches of each material in proportion to the blend weight, which thus exhibits heterogeneity in the "horizontal" direction. The mix operation of two slabs $S_0$ and $S_1$ with weight $w_1$, generating a new “horizontally” heterogeneous composite material $M$, is denoted: \begin{equation} M = \mathrm{\mathbf{mix}}(S_0, S_1, w_1) \end{equation} where the $M \rightarrow S_0$ as $w_1 \rightarrow 0$, and $M \rightarrow S_1$ as $w_1 \rightarrow 1$. Diagrammatically, we represent the mix as putting the two slabs horizontally adjacent, where the intention is that one should imagine the physical slabs lying adjacent at the same surface level, though randomly distributed in mesoscopic patches with relative area in proportion to the given mix weight.


  •            1 - w1              w1                    *
    
  •   f0 +-----------------+-----------------+ f1        *
    
  •      |                 |                 |           *
    
  •      |       V0        |       V1        |           *
    
  •      |                 |                 |           *
    
  •      +-----------------+-----------------+           *
    
  •                                                      *
    

The mix operation is also used to describe the probability that a particular layer structure exists in the material at a particular point. For example a coating $S_\mathrm{coat}$ may cover the substrate layers $S_\mathrm{sub}$, but be intermittent and applied only to some fraction $w_\mathrm{coat}$ (the coat presence or coverage weight) of the substrate. This would be specified as \begin{equation} \mathrm{\mathbf{mix}}(S_\mathrm{sub}, \mathrm{\mathbf{layer}}(S_\mathrm{sub}, S_\mathrm{coat}), w_\mathrm{coat}) \ . \end{equation} For convenience this may also be written more concisely as a weighted layer operator which covers a given fraction of the substrate with the coat layer: \begin{equation} \mathrm{\mathbf{layer}}(S_\mathrm{sub}, S_\mathrm{coat}, w_\mathrm{coat}) \ . \end{equation}


  • +-----------------+-----------------+ *
  • | | | *
  • | | Scoat | *
  • | | | *
    •  Ssub       +-----------------+  *
      
  • | | | *
  • | | Ssub | *
  • | | | *
  • +-----------------+-----------------+ *
  • substrate coated intermittently     *
    

This physical picture of the mix operation becomes somewhat unrealistic in some cases where the bottom-most bulk materials being blended are not obviously consistent (e.g. blending dielectric and metallic bulks), but in such cases it is understood that the implementation should do the best it can to make sense of the physics. For example the metal bulk could be considered to actually be surface metallic flakes on top of a single consistent dielectric.

The implementation of the mix operation in a renderer depends on how the material model is approximated. Typically the model will be reduced to an effective BSDF per slab being mixed, in which case the mix can be implemented simply as a linear blend of those BSDFs, i.e. if slabs $S_0$, $S_1$ have BSDFs $f_0$, $f_1$ respectively, then the BSDF of $\mathrm{\mathbf{mix}}(S_0, S_1, w_1)$ can be mapped to 3 \begin{equation} f_\mathrm{mix} = (1 - w_1) f_0 + w_1 f_1 = \mathrm{lerp}(f_0, f_1, w_1) \ . \end{equation}

In the case of the weighted layer operation, if the BSDF of the substrate is $f_\mathrm{sub}$ then $\mathrm{\mathbf{layer}}(S_\mathrm{sub}, S_\mathrm{coat}, w_\mathrm{coat})$ maps to \begin{equation} f_\mathrm{weighted-layer} = (1 - w_\mathrm{coat}) f_\mathrm{sub} + w_\mathrm{coat} f_\mathrm{layer} \end{equation} where $f_\mathrm{layer}$ is the BSDF corresponding to $\mathrm{\mathbf{layer}}(S_\mathrm{sub}, S_\mathrm{coat})$. If we use the non-reciprocal albedo-scaling approach described in the Layering section (equation [non-reciprocal-albedo-scaling-with-T]), then $f_\mathrm{layer}$ can be expressed as \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 3, \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} which, for example, is the formula used in the Autodesk Standard Surface [#Georgiev2019] coat layer.

In this fashion the abstract mix and layer operations can be mapped to a more computationally convenient approximate representation in terms of a weighted sum of BSDF lobes (see the Reduction to a mixture of lobes section for more details).

Emission model

Each slab also has an emission distribution function (EDF), though it corresponds by default to no emission at all. Emissive properties are expressed in photometric units, since reference values are widely available. Thus the EDF is a directional luminance function $L_e$. One can imagine the luminance emitted homogeneously from the slab interior (by some unspecified physical process).

The conversion to radiometric units is the responsibility of the renderer. For RGB renderers, a simple approximation is proposed in [#Lagarde2014].

We will generally assume in this model that the emission is uniformly distributed in all directions into the hemisphere. The emission from the structure as a whole is then physically determined (in principle) by the propagation of this emitted light from the emitting slabs through their neighbors into the ambient space.

Metadata

This specification is designed to facilitate exchange of assets between facilities which may use different render engines and pipelines. To this end it attempts to reduce the ambiguity about the final look, so that assets can be expected to render roughly the same visually if the implementation conforms reasonably well to the specification.

However the parameters of the physical model that we describe do not specify all of the assumptions that would be needed to obtain a good visual match. We recommend therefore, for the purposes of asset exchange, that the parameters be packaged with certain metadata that provides the following missing information:

  • The version of the specification implemented.

  • The assumed color space of all the color parameters. If unspecified, following MaterialX [#Smythe2016], by default this color space is assumed to be ACEScg.

  • The floating-point conversion factor from the parameters given in world space length units to meters.

  • The association between any supplied texture files and the parameters which they specify, generating spatially varying parameters according to the local UV coordinates of the geometry.

  • Any shader networks which drive the parameters of the model.

  • The assumed convention for converting the input geometry_normal, geometry_tangent and geometry_coat_normal maps, if present, to the final shading normal of the local surface at each point.

As in practice OpenPBR will be integrated within data exchange frameworks such as MaterialX and USD, the specific form and content of this metadata is outside the scope of this specification.

Model

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 the structure differs), where the material structure looks informally like the following diagram:


  •                                                                     emission                         *
    
  •                                                                         ^                            *
    
  • ambient medium | *
  • +-----------+---------------------------------------------------------------|------------+ *
  • | | fuzz | | *
  • | +---------------------------------------------------------------|------------+ *
  • | | coat | | *
  • | +---------------------+---------------------+----------------+--+------------+ <-- thin-film *
  • | |░░░░░░░░░░░░░░░░░░░░░| | | | *
  • | |░░░░░░░░░░░░░░░░░░░░░| | | gloss | *
  • | |░░░░░░░ metal ░░░░░░░| translucent | subsurface | | *
  • | |░░░░░░░░░░░░░░░░░░░░░| base | +---------------+ *
  • | |░░░░░░░░░░░░░░░░░░░░░| | |░░░░░░░░░░░░░░░| *
  • | ambient |░░░░░░░░░░░░░░░░░░░░░| | |░░░░diffuse░░░░| *
  • | medium |░░░░░░░░░░░░░░░░░░░░░| | |░░░░░░░░░░░░░░░| *
  • +-----------+ - - - - - - - - - - +- - - - - - - - - - -+ - - - - - - - -+ - - - - - - - + *
  •                                                      <--------- opaque-base -------->                *
    
  •                                <------------------ dielectric-base ----------------->                *
    
  •          <---------------------------------- base ---------------------------------->                *
    

To summarize the formal structure, this consists of the following slabs:

\begin{eqnarray} S_\textrm{ambient-medium} &=& \mathrm{Slab}(\emptyset) \nonumber \ S_\textrm{fuzz} &=& \mathrm{Slab}(f_\mathrm{fuzz}, V_\mathrm{fuzz}) \nonumber \ S_\textrm{coat} &=& \mathrm{Slab}(f_\mathrm{coat}, V_\mathrm{coat}) \nonumber \ S_\textrm{metal} &=& \mathrm{Slab}(f_\mathrm{conductor}) \nonumber \ S_\textrm{translucent-base} &=& \mathrm{Slab}(f_\mathrm{dielectric}, V^\infty_\mathrm{dielectric}) \nonumber \ S_\textrm{subsurface} &=& \mathrm{Slab}(f_\mathrm{dielectric}, V^\infty_\mathrm{subsurface}) \nonumber \ S_\textrm{gloss} &=& \mathrm{Slab}(f_\textrm{dielectric}, V_\mathrm{dielectric}) \nonumber \ S_\textrm{diffuse} &=& \mathrm{Slab}(f_\textrm{diffuse}) \nonumber \ \end{eqnarray}

Which are composed to build the material structure, denoted $M_\textrm{PBR}$ below, as follows:

\begin{align*} M_\textrm{PBR} &= \mathrm{\mathbf{mix}} (S_\textrm{ambient-medium} , M_\textrm{surface}, \mathtt{\alpha}) \quad\quad &\mathrm{where} ; \mathtt{\alpha} &= \mathtt{geometry _ opacity} \nonumber \ M_\textrm{surface} &= \mathrm{\mathbf{layer}}(M_\textrm{coated-base} , S_\textrm{fuzz}, \mathtt{F}) \quad\quad &\mathrm{where} ; \mathtt{F} &= \mathtt{fuzz _ weight} \nonumber \ M_\textrm{coated-base} &= \mathrm{\mathbf{layer}}(M_\textrm{base-substrate} , S_\textrm{coat}, \mathtt{C}) \quad\quad &\mathrm{where} ; \mathtt{C} &= \mathtt{coat _ weight} \nonumber \ M_\textrm{base-substrate} &= \mathrm{\mathbf{mix}} (M_\textrm{dielectric-base}, S_\textrm{metal}, \mathtt{M}) \quad\quad &\mathrm{where} ; \mathtt{M} &= \mathtt{base _ metalness} \nonumber \ M_\textrm{dielectric-base} &= \mathrm{\mathbf{mix}} (M_\textrm{opaque-base} , S_\textrm{translucent-base}, \mathtt{T}) \quad\quad &\mathrm{where} ; \mathtt{T} &= \mathtt{transmission _ weight} \nonumber \ M_\textrm{opaque-base} &= \mathrm{\mathbf{mix}} (M_\textrm{glossy-diffuse} , S_\textrm{subsurface}, \mathtt{S}) \quad\quad &\mathrm{where} ; \mathtt{S} &= \mathtt{subsurface _ weight} \nonumber \ M_\textrm{glossy-diffuse} &= \mathrm{\mathbf{layer}}(S_\textrm{diffuse} , S_\textrm{gloss}) \end{align*}

This has the form of a tree generated by the layer and mix operations:

![](images/layer_graph.png width=90%)

     

In addition to the weight and opacity parameters explicit in the model structure above, the properties of each component slab are controlled via further parameters detailed below (see the Parameter reference section for the full set).

Since the model is simply a physical description of a material structure, in principle it would be amenable to solution via accurate methods such as those developed in [#Jakob2014], [#Belcour2018], and [#Zeltner2018], which attempt to compute all the various modes of reflection and transmission through the whole stack of layers, generating a final BSDF which is not necessarily a simple linear combination of the individual interface BSDFs. However we want this material model to be renderable on a wide range of platforms, from offline path tracers all the way to real-time game engines on mobile devices. Enforcing a particular implementation would make the use of the material model impractical for certain classes of renderers, and ultimately make the model less useful. For this reason we consider the choice of a specific implementation of the final BSDF to be outside the scope of this specification.

For convenience and efficiency, at present it is most likely to be mapped to a model consisting of a mixture of BSDF lobes similar to the Autodesk Standard Surface shader [#Georgiev2019] and its representation in MaterialX. An example derivation of such a model is provided in the "Reduction to a mixture of lobes" section below. We also provide a reference implementation in MaterialX based on this derivation.

We now discuss the detailed form of the BSDFs and media of the slabs in the structure.

Microfacet model

We give here some general assumptions about the form and parametrization of the BSDFs which describe the interfaces in the model outlined in the previous section.

The BSDFs $f_\mathrm{conductor}$, $f_\mathrm{dielectric}$, $f_\mathrm{coat}$ and $f_\mathrm{diffuse}$ of the metal, dielectric, coat and glossy-diffuse slabs respectively, are each assumed to be described by a standard microfacet model. This is a widely used approximation ([#Pharr2023]) in which the surface is assumed to be composed of a heightfield consisting of smooth microfacets of either metal, dielectric or Lambertian material, where the statistical distribution of the normal of these facets, termed the micronormal, determines the surface roughness characteristics at the macroscopic scale. (The fuzz model is distinct and based on a volumetric "microflake" model [#Heitz2015]).

A microfacet BRDF has the standard form 4 ([#Walter2007], [#Pharr2023]) in the single-scattering approximation: \begin{equation} \label{microfacet_brdf_ss} f(\omega_i, \omega_o) \propto F(\omega_i, h) ; D(h) ; G(\omega_i, \omega_o) \end{equation} where $h = (\omega_i+\omega_o)/|\omega_i+\omega_o|$ is the half-vector, i.e. the micronormal which mirror reflects $\omega_i$ into $\omega_o$. For dielectrics there is also a BTDF, i.e. the portion of the BSDF where the input and output directions lie in opposite rather than the same hemispheres, which has a similar form to the BRDF (except with a modified half-vector and Fresnel factor) [#Walter2007].

The Fresnel factor $F(\omega_i, h)$ is determined by the index of refraction of the reflecting material, and its form differs depending on whether the material is a dielectric or conductor [#Walter2007]. Its parametrization in each case is described in the Dielectric base section and Metal section. 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 [#Heitz2014b].

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 (originally "Ground Glass unknown": [#Walter2007], [#Burley2012], [#Heitz2014b], [#Pharr2023]), which has the basic 5 form: \begin{equation} \label{GGX} D_\mathrm{GGX}(m) \propto \left( 1 + \frac{\tan^2\theta_m}{\alpha^2} \right)^{-2} \end{equation} where $\theta_m$ is the angle between $m$ and the (macroscopic) surface normal, and the parameter $\alpha$ controls the apparent roughness of the microsurface. As $\alpha \rightarrow 0$, the distribution of normals becomes highly peaked around $\theta_m=0$ so the microsurface is mostly flat leading to a smooth appearance, while as $\alpha$ grows the microsurface becomes increasingly jagged, leading to a rough appearance. In practice we restrict to the range $\alpha \in [0,1]$, as $\alpha &gt; 1$ does not produce a plausible rough appearance. Following [#Burley2012], we set (in the isotropic case) \begin{equation} \alpha = r^2 \end{equation} where $r \in [0,1]$ is the user-facing roughness, as this produces a more perceptually linear resulting change in apparent roughness as $r$ is varied.

In the general case the roughness is anisotropic, that is the NDF is not circularly symmetric but stretched along some direction in the surface plane, producing an elongation of the specular highlight along that direction. This simulates coherent microscale groove geometry perpendicular to the stretch direction due to processes like scratches or brushing. It is assumed that a reference tangent vector field is defined (via geometry_tangent), and the surface tangent vector direction is then specified as a polar angle relative to it. The tangent direction corresponds to the direction in which the highlights are elongated (equivalently, the surface grooves lie along the orthogonal bitangent). The GGX distribution in the anisotropic case is then parametrized by two separate $\alpha$-roughnesses $\alpha_t$ and $\alpha_b$ along the tangent and bitangent vectors as follows, given the polar angle $\phi_m$ of the micronormal $m$ relative to the tangent (counterclockwise about the normal): \begin{equation} D_\mathrm{GGX}(m) \propto \left( 1 + \tan^2\theta_m \left(\frac{\cos^2\phi_m}{\alpha_t^2} + \frac{\sin^2\phi_m}{\alpha_b^2}\right) \right)^{-2} \end{equation} which reduces to the isotropic form when $\alpha_t = \alpha_b = \alpha$.

!!! Note: Future work The GGX NDF is based on the Trowbridge-Reitz NDF. [#Burley2012] proposed the Generalized-Trowbridge-Reitz (GTR) NDF which has an exponent $\gamma$ giving more control over the tail of the NDF, and where GGX is the special case $\gamma=2$. More recently, other generalized NDFs based on the Student's $t$-distribution have been proposed [#d'Eon2023]. It is an open question whether a more general NDF such as this would be a valuable addition to the model.

The NDF terms $\alpha_t$ and $\alpha_b$ are more conveniently parametrized as the total roughness $r$ and an anisotropy $a \in [0, 1]$. We suggest the following mapping from $r, a$ to $\alpha_t, \alpha_b$: \begin{equation} \label{openpbr-anisotropy-formula} \alpha_t = r^2 \sqrt{\frac{2}{1 + (1 - a)^2}} ;\ , \quad \alpha_b = (1 - a) , \alpha_t \ . \end{equation} This formulation satisfies $\alpha_t^2 + \alpha_b^2 = 2\alpha^2$, to preserve the average roughness regardless of the anisotropy. A rationale is that if a renderer doesn't support anisotropy (or if the feature is turned off for performance considerations, such as level of detail), using only the roughness parameter should result in an isotropic specular highlight perceptually close to the original anisotropic one. Figure [ndf_anisotropy] shows the resulting shape of the highlight (technically, these are contour lines of the NDF $D_\mathrm{GGX}(m)$ in the 2D slope space).

![Figure [ndf_anisotropy]: NDF shapes as a function of roughness $r$ and anisotropy $a$.](images/anisotropy.png width=60%)

!!! Note: Future work The exact conversion from roughness $r$ and anisotropy $a$ parameters to NDF roughness parameters $\alpha_t$ and $\alpha_b$ is not settled yet, and the formulation described needs validation from artists. Other possible parametrizations are worth considering, but our tests indicate that finding a parametrization that offers superior expressivity while remaining predictable requires more investigation.

To summarize the NDF parameterization, the dielectric-base BSDF $f_\mathrm{dielectric}$ and metal-base BRDF $f_\mathrm{conductor}$ share the same parameters, while the coat BSDF $f_\mathrm{coat}$ uses an independent set:

  • specular_roughness for both $f_\mathrm{dielectric}$ and $f_\mathrm{conductor}$, and coat_roughness for $f_\mathrm{coat}$, define the roughness parameter $r$. These roughnesses are given a soft-maximum at 1, since $r=1$ corresponds to a perceptually very rough surface.

  • specular_anisotropy for $f_\mathrm{dielectric}$ and $f_\mathrm{conductor}$, and coat_anisotropy for $f_\mathrm{coat}$, specify $a \in [0, 1]$ (the degree to which the specular highlight is stretched in the direction of anisotropic rotation). The resulting NDF $\alpha_t$, $\alpha_b$ parameters are then determined by equation [openpbr-anisotropy-formula].

  • specular_rotation for $f_\mathrm{dielectric}$ and $f_\mathrm{conductor}$, and coat_rotation for $f_\mathrm{coat}$, specify direction of the elongation of the specular highlight. The rotation is normalized to $[0, 1]$ representing angles from 0° to 360° counterclockwise about the normal, with 0° being the original tangent vector direction. Note that the appearance of the specular highlight is identical for rotations between $[0, 0.5]$ and $[0.5, 1]$; this allows the preservation of value when converting to/from other models that support directional anisotropy.

The single-scattering microfacet BRDF of equation [microfacet_brdf_ss] does not conserve energy, as it neglects to account for multiple scattering between the microfacets. An implementation should ideally account for this, via one of a number of schemes, otherwise the reflection from rough metals and dielectrics is dimmer and less saturated than it should be. A fully accurate approach is described in [#Heitz2016], where the multiple bounces are explicitly modeled via Monte Carlo. Simpler approximate models are presented in [#Kulla2017] (which functions by adding compensation lobes to account for the missing energy), and [#Turquin2019] (which scales the albedo of the lobe to maintain energy preservation at the expense of reciprocity).

Base Substrate

The bulk at the bottom of the material structure, termed the base substrate, consists of a statistical mix of metal and dielectric semi-infinite slabs:

\begin{eqnarray} M_\textrm{base-substrate} &=& \mathrm{\mathbf{mix}} (M_\textrm{dielectric-base}, S_\textrm{metal}, \mathtt{M}) \end{eqnarray} where $\mathtt{M} = \mathtt{base_metalness}$, which controls the fraction of microsurface area which is metallic. Areas of surface will normally be either fully metallic or fully dielectric, but values of base_metalness between 0 and 1 can be used to simulate smoothly blended transitions between areas of bare metal and areas of dielectric (modeling for example opaque rust or paint on top of the metal). Metalness maps from applications like Substance Painter can be connected to this parameter. The parameters controlling the metal BRDF are covered in the Metal section.


  •                                                base_metalness         1 - base_metalness                     *
    
  • +-----------------------------------+ +------------------------+------------------------+ <---- thin-film *
  • | | |░░░░░░░░░░░░░░░░░░░░░░░░| | *
  • | base-substrate | == |░░░░░░░░░ metal ░░░░░░░░| dielectric-base | *
  • | | |░░░░░░░░░░░░░░░░░░░░░░░░| | *
  • +- - - - - - - - - - - - - - - - - -+ +- - - - - - - - - - - - + - - - - - - - - - - - -+ *

Rainbow-like iridescence effects occur due to interference when a thin refractive film with thickness on the order of the light wavelength is placed on top of a material. To model this, there is assumed to be such a thin-film sitting on top of the base substrate (whether metal or dielectric), parametrized only by its thickness and the film IOR. In practice, these effects are most easily incorporated directly into the microfacet BSDFs of both the metal and dielectric-base layers. The currently recommended thin-film model is that of Belcour and Barla [#Belcour2017].

!!! Note: Future work It is currently not physically clear enough how the IOR of the surrounding media affects the thin-film interference, and how the thin-film affects the Fresnel of the adjacent slabs. Moreover, the behavior of the current parametrization is arguably unintuitive, as the effect of the thickness is not obvious. It may be useful to have a more artist-friendly dial of the "iridescence".

Thin-film params Label Type Range Norm Default Description
thin_film_thickness Thickness float $ [0, \infty) $ $ [0, 2000] $ $ 0 $ Thickness of the film in nanometers
thin_film_ior IOR float $ (0, \infty) $ $ [1, 3] $ $ 1.5 $ 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%)

![Figure [thinfilm]: **`thin_film_thickness`** varying over 0, 500, 1000 nanometers](dummy)

Dielectric base

The dielectric base is assumed to have a surface BSDF described by a rough GGX dielectric microfacet model [#Walter2007], and a bulk volumetric medium supporting absorption and scattering (whether physically due to the inherent molecular properties of the dielectric as in water, or e.g. a dispersion of embedded particles or flakes as in paint).

However we distinguish between a separate "translucent" dielectric bulk and "opaque" dielectric bulk, which are placed in a statistical mix: \begin{equation} M_\textrm{dielectric-base} = \mathrm{\mathbf{mix}}(M_\textrm{opaque-base}, S_\textrm{translucent-base}, \mathtt{T}) \end{equation} where $\mathtt{T} = \mathtt{transmission_weight}$.


  •                                           1 - transmission_weight     transmission_weight    *
    
  • +-----------------------------------+ +------------------------+------------------------+ *
  • | | |░░░░░░░░░░░░░░░░░░░░░░░░| | *
  • | dielectric-base | == |░░░░░ opaque-base ░░░░░░| translucent-base | *
  • | | |░░░░░░░░░░░░░░░░░░░░░░░░| | *
  • +- - - - - - - - - - - - - - - - - -+ +- - - - - - - - - - - - + - - - - - - - - - - - -+ *

This mirrors the usual workflow of artists where they are typically either modelling an opaque surface potentially with some specularity and dense subsurface scattering (such as rock, plastic, skin etc.), or a translucent material with some limited amount of volumetric absorption and scattering (such as glass, liquids, organic matter etc.). These use cases require different parametrizations to effectively control, so are convenient to split into separate slabs.

The translucent-base is described in the Translucent base section, while the opaque-base is further broken down below (into Glossy-diffuse and Subsurface). The transmission_weight parameter selects between these models. Note that technically a mix weight between 0 and 1 produces a physically ambiguous state (since there are then superimposed bulk media with different properties), so we expect that normally this weight acts as a Boolean selector.

The opaque-base substrate is assumed to be a dielectric with dense subsurface volumetric absorption and scattering, which tends to an idealized "glossy-diffuse" BSDF in the limit of infinite density medium. In some cases a blend of subsurface and completely opaque glossy-diffuse scattering is desired, for example in skin rendering where the diffuse component provides the surface details of the skin (freckles, blemishes, makeup, etc.) and the subsurface component provides the color detail of the underlying veins and tissue. To support this, we make the opaque-base substrate be a statistical mix of glossy-diffuse and subsurface models (described in the Glossy-diffuse section and the Subsurface section respectively): \begin{eqnarray} M_\textrm{opaque-base} &=& \mathrm{\mathbf{mix}}(M_\textrm{glossy-diffuse}, S_\mathrm{subsurface}, \mathtt{S}) \end{eqnarray} where $\mathtt{S} = \mathtt{subsurface_weight}$.


  •                                            1 - subsurface_weight      subsurface_weight      *
    
  • +-----------------------------------+ +------------------------+------------------------+ *
  • |░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| |░░░░░░░░░░░░░░░░░░░░░░░░| | *
  • |░░░░░░░░░░░ opaque-base ░░░░░░░░░░░| == |░░░░ glossy-diffuse ░░░░| subsurface | *
  • |░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| |░░░░░░░░░░░░░░░░░░░░░░░░| | *
  • +- - - - - - - - - - - - - - - - - -+ +- - - - - - - - - - - - + - - - - - - - - - - - -+ *

Both the opaque and translucent dielectric-base share the same dielectric interface BSDF $f_\mathrm{dielectric}$, whose parameters are termed "specular" since they control the primary specular reflection lobe which is provided by the base dielectric (and the coat provides a secondary specular lobe, see the Coat section):

  • The specular_weight and specular_color parameters modulate the Fresnel factor of $f_\mathrm{dielectric}$. Note that these are technically unphysical if altered from the defaults (as real dielectrics have a Fresnel factor dependent only on the index of refraction), but can be useful in practice (for example, to simulate green or purple anti-reflective coatings on lenses). The light transmitted through the dielectric will be compensated accordingly to preserve the energy balance (thus generating a complementary color if specular_color is not white).

  • The specular lobe shape is controlled by the roughness properties of the surface, parametrized by specular_roughness, specular_anisotropy, and specular_rotation (see the section on the Microfacet model NDF).

  • The specular_ior parameter controls the index of refraction of the dielectric, which in this case only affects the Fresnel factor. The specular_ior_level parameter additionally provides a convenient $[0, 1]$ control for dialing the dielectric reflectivity (at normal incidence) to zero at the minimum and double the original reflectivity at the maximum, by modulating the IOR. This is useful for texturing the specular reflectivity in a more physically correct way than via the specular_weight (since low specular_weight suppresses the entire specular lobe at all viewing angles, while low specular_ior_level still retains the Fresnel highlights at grazing angles).

The formula for the specular IOR modulation is as follows. Given the existing specular_ior, the ratio $\eta_s$ of this to the IOR of the surrounding medium is computed (which should take into account the presence of the coat, according to equation [effective_coat_ior] in the Coat section). Given this ratio, the dielectric Fresnel reflection factor of $f_\mathrm{dielectric}$ at normal incidence is given by \begin{equation} F_s = \frac{|\eta_s - 1|^2}{(\eta_s + 1)^2} \ . \end{equation} This Fresnel factor is then modulated by multiplying by twice $\xi_s = \mathtt{specular_ior_level}$. Thus solving for the new IOR ratio $\eta^\prime_s$ after the modulation: \begin{equation} \label{modulated_ior} \eta^\prime_s = \frac{1 + \mathrm{sgn}(\eta_s-1)\sqrt{2,\xi_s F_s}} {1 - \mathrm{sgn}(\eta_s-1)\sqrt{2, \xi_s F_s}} \ . \end{equation} Note there is a constraint $\xi_s &lt; 1/(2 F_s)$ since the scaled reflection coefficient cannot exceed $1$. So the range of $\xi_s$ needs to be clamped: $\xi_s \in [0, \mathrm{min}(1, 1/(2 F_s)]$. Applying this modulated IOR ratio $\eta^\prime_s$ in the dielectric Fresnel factor then produces the desired reflectivity modulation at any incident angle (according to the standard formula for the dielectric Fresnel factor, assuming unpolarized light).

Specular params Label Type Range Norm Default Description
specular_weight Weight float $ [0, 1] $ $ 1 $ Scalar multiplier to the dielectric Fresnel factor
specular_color Color color3 $ [0, 1]^3 $ $ (1, 1, 1) $ Tints the dielectric Fresnel factor
specular_roughness Roughness float $ [0, \infty) $ $ [0, 1] $ $ 0.3 $ Roughness of NDF of dielectric BSDF $f_\mathrm{dielectric}$
specular_anisotropy Anisotropy float $ [0, 1] $ $ 0 $ Anisotropy of NDF of dielectric BSDF $f_\mathrm{dielectric}$
specular_rotation Rotation float $ [0, 1] $ $ 0 $ Orientation of roughness anisotropy
specular_ior IOR float $ (0, \infty) $ $ [1, 3] $ $ 1.5 $ Refractive index of $V_\mathrm{dielectric}$
specular_ior_level IOR level float $ [0, 1] $ $ 0.5 $ Modulates the dielectric reflectivity at normal incidence between zero and double the original

![](images/spec_ior1.png width=95%) ![](images/spec_ior2.png width=95%) ![](images/spec_ior3.png width=95%)

![Figure [specular]: Varying the **`specular_ior`** from (left to right): 1.1, 1.3, 1.5 (default)](dummy)

Glossy-diffuse

The glossy-diffuse slab represents a dielectric with rough GGX microfacet surface BSDF (whose "specular" parameters are described in the Dielectric base section), embedding a semi-infinite bulk of extremely dense scattering material. We choose to model this concretely as a layer of dielectric "gloss" on top of an opaque slab with a diffuse BRDF: \begin{eqnarray} M_\textrm{glossy-diffuse} = \mathrm{\mathbf{layer}}(S_\mathrm{diffuse}, S_\textrm{gloss}) \end{eqnarray}


  • +-------------------------------------------------+ *
  • | gloss | *
  • +-------------------------------------------------+ *
  • | diffuse | *
  • +-------------------------------------------------+ *

where $S_\textrm{gloss}$ is a thin slab of dielectric with the rough dielectric microfacet BRDF as parametrized in the Dielectric base section, and the same internal medium as the base dielectric except with zero extinction due to infinitesimal layer thickness: \begin{eqnarray} S_\textrm{gloss} = \mathrm{Slab}(f_\mathrm{dielectric}, V_\mathrm{dielectric}) \ . \end{eqnarray} The opaque substrate slab has a diffuse BRDF lobe: \begin{eqnarray} S_\textrm{diffuse} = \mathrm{Slab}(f_\mathrm{diffuse}) \end{eqnarray} where $f_\mathrm{diffuse}$ is defined to be the classic Oren-Nayar model ([#Oren1994], [#Pharr2023]), which is a microfacet model where the microfacets are individually Lambertian, with albedo specified by base_weight multiplied by base_color, and a roughness parameter given by base_roughness.

The resulting BRDF of the glossy-diffuse slab is the combination of a "glossy" specular lobe provided by reflection from the dielectric interface, and a diffuse lobe provided by bounces off the substrate. This models for example the reflection from shiny, totally opaque surfaces such as dense plastic, rock, and concrete. This form of BRDF model is classic in computer graphics and typically termed the Ashikhmin-Shirley or Kelemen model ([#Ashikhmin2000], [#Kelemen2001], [#Kulla2017], [#Kutz2021]).

A reasonable practical albeit non-reciprocal approximation to the resulting BRDF of the glossy-diffuse slab is \begin{equation} f_\textrm{glossy-diffuse}(\omega_i, \omega_o) \approx f_\mathrm{dielectric}(\omega_i, \omega_o) + \bigl(1 - E_\mathrm{dielectric}(\omega_o)\bigr) ,f_\mathrm{diffuse}(\omega_i, \omega_o) \ , \end{equation} obtained via the non-reciprocal albedo-scaling approximation of equation [non-reciprocal-albedo-scaling].

Glossy-diffuse params Label Type Range Norm Default Description
base_weight Weight float $ [0, 1] $ $ 1 $ Scalar multiplier to base_color
base_color Color color3 $ [0, 1]^3 $ $ (0.8, 0.8, 0.8) $ Reflection albedo color of $f_\mathrm{diffuse}$
base_roughness Roughness float $ [0, \infty) $ $ [0, 1] $ $ 0 $ Roughness of the diffuse lobe $f_\mathrm{diffuse}$

![](images/glossy_diffuse_diffuseonly.png width=99%) ![](images/glossy_diffuse_speconly.png width=99%) ![](images/glossy_diffuse_sum.png width=99%)

![Figure [fuzz]: Wood rendered as glossy-diffuse, composed of diffuse lobe (left), specular lobe (middle), and their normalized sum. Near the specular highlight the diffuse lobe is automatically reduced since energy is conserved.](dummy)

Subsurface

The subsurface slab represents a dielectric embedding a dense scattering volumetric medium, which generates significant light bleeding effects due to light propagation and diffusion under the surface, where in general the exiting ray leaves at a different surface location than the incident ray. Physically, as for the slabs defined in the Glossy-diffuse section and Translucent base section, this is a dielectric substrate with surface BSDF $f_\mathrm{dielectric}$ and homogeneous interior medium $V^\infty_\mathrm{subsurface}$:

\begin{equation} S_\mathrm{subsurface} = \mathrm{Slab}(f_\mathrm{dielectric}, V^\infty_\mathrm{subsurface}) \ . \end{equation}

As for the glossy-diffuse slab and the translucent-base, the subsurface is bounded by a dielectric interface with BSDF $f_\mathrm{dielectric}$, which generates the primary specular lobe parametrized via the "specular" parameters as described in the Dielectric base section.

Superimposed on this is the reflection generated by scattering in the subsurface medium. In this case the subsurface medium $V^\infty_\mathrm{subsurface}$ is given a parametrization which is particularly convenient for controlling the volumetric effect of dense subsurface scattering:

  • subsurface_radius * subsurface_radius_scale: the desired size of the "blur" on the surface per RGB channel, i.e. roughly the average distance that light travels along the surface per-channel, $\mathbf{r}$, also termed the diffusion radius. Being a length, subsurface_radius can be any value greater than or equal to zero. For convenience, we make the soft range $[0, 1]$, thus covering common cases.
  • subsurface_color: the observed RGB reflection albedo color taking into account all orders of multiple scattering, $\mathbf{A}$, also termed the multi-scatter albedo.
  • subsurface_anisotropy: the medium's phase function (assumed to be the standard Henyey-Greenstein form), parametrized by the scalar anisotropy $g \in [-1, 1]$.

To minimize the entanglement and side effects of these parameters, they should each affect only the corresponding aspect of the subsurface scattering, e.g. the color should not affect the size of the blur and the anisotropy should not affect the size of the blur or the color. We stipulate here a mapping which achieves these requirements and reproduces the specified RGB diffusion profile size (width on the surface) $\mathbf{r}$ and RGB multi-scatter albedo $\mathbf{A}$, by combining the empirically-derived mapping of [#Burley2018] with similarity theory. This defines in detail how the subsurface parameters collectively determine the underlying volumetric parameters (extinction $\boldsymbol{\mu}_t$, single-scattering albedo $\boldsymbol{\alpha}$, and phase function anisotropy $g$).

[#Burley2018] derived (via fitting Monte Carlo simulations) an approximate relationship between the specified surface diffusion profile width $\mathbf{r}$ and multi-scatter albedo $\mathbf{A}$, and the physical extinction coefficient $\boldsymbol{\mu}_t$ which generates that profile width: $\boldsymbol{\mu}_t = 1/(S(\mathbf{A})\mathbf{r})$, where the scale-factor $S(\mathbf{A})$ is given by: \begin{equation} S(\mathbf{A}) = 4.012 - 15.21 \mathbf{A} + 32.34 \mathbf{A}^2 - 34.68 \mathbf{A}^3 + 13.91 \mathbf{A}^4 \ . \end{equation} Similarly the RGB single-scattering albedo $\boldsymbol{\alpha}$ is approximately given by \begin{equation} \boldsymbol{\alpha}(\mathbf{A}) = 1 - e^{-11.43 \mathbf{A} + 15.38 \mathbf{A}^2 - 13.91 \mathbf{A}^3} \ . \end{equation} The physical RGB scattering coefficient is then given by $\boldsymbol{\mu}_s = \boldsymbol{\alpha},\boldsymbol{\mu}_t$.

This relationship was derived (via fitting) in the isotropic $g=0$ case. To account for anisotropy, similarity theory [#d'Eon2021] shows that a medium with anisotropy $g$ will have approximately similar overall light transport to an isotropic medium (while still exhibiting noticeably different directional effects, especially in low-order scattering) provided that the scattering coefficient is remapped to $\bar{\boldsymbol{\mu}}_s = \boldsymbol{\mu}_s / (1 - g)$, while keeping the absorption coefficient the same. Applying this, the net result is that the remapped single-scattering albedo $\bar{\boldsymbol{\alpha}}$ is given by \begin{equation} \bar{\boldsymbol{\alpha}} = \frac{\boldsymbol{\alpha}} {1 - g (1 - \boldsymbol{\alpha})} \ , \end{equation} and remapped extinction coefficient $\bar{\boldsymbol{\mu}}_t$ by \begin{equation} \bar{\boldsymbol{\mu}}_t = \frac{1 - g (1 - \boldsymbol{\alpha})}{1 - g} \boldsymbol{\mu}_t \ . \end{equation} Note that due to the singularity at $g=1$, in practice the anisotropy needs to be limited to be not too close to 1.

Implementations may choose to compute light transport in the subsurface medium either via a fast, approximate bidirectional scattering surface reflectance distribution (BSSRDF) model using e.g. the dipole approximation [#Jensen2001], or more accurately via volumetric path tracing ([#Novak2018], [#Pharr2023]).

Note that the default value of subsurface_radius_scale is set at $(1, 0.5, 0.25)$ to approximate the effect of Rayleigh scattering. If we roughly approximate the wavelength corresponding to each of the RGB channels as $\lambda/\mathrm{nm} \approx 650, 550, 450$ and assume the radii scale like the reciprocal of the extinction, then since in Rayleigh scattering the extinction scales like $\lambda^{-4}$ for light of wavelength $\lambda$ the expected relative magnitudes of the radii are $(1, (550/650)^4, (450/650)^4) \approx (1, 0.5, 0.25)$, hence the chosen default. This provides a slightly more realistic default look for the subsurface than resulting from gray radii.

!!! Note: Future work The particular equations for $S(\mathbf{A})$ and $\boldsymbol{\alpha}(\mathbf{A})$ presented here make certain approximations (e.g. assumptions about the dielectric interface IOR). Ideally the mapping would be generalized to an arbitrary dielectric interface.

Since the scattered ray will in emerge from a different point on the surface than the input point, the material will in general differ there. Thus on transmitting back out, it will encounter different layer properties. In principle this should be taken into account, but how to model subsurface scattering in the presence of varying subsurface properties is an open question.

Subsurface params Label Type Range Norm Default Description
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) $ Subsurface color, i.e. the multi-scatter albedo of $V^\infty_\mathrm{subsurface}$
subsurface_radius Radius float $ [0, \infty) $ $ [0, 1] $ $ 1 $ Length scale of diffusion along the surface
subsurface_radius_scale Radius scale vector3 $ [0, 1]^3 $ $ (1.0, 0.5, 0.25) $ RGB multiplier to subsurface_radius, giving the per-channel diffusion length
subsurface_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%)

![Figure [subsurface]: The effect of varying the subsurface scattering radius (**`subsurface_radius`**)](dummy)

Translucent base

For cases where the substrate medium is translucent, i.e. transmits and refracts a significant quantity of light, we provide a separate parametrization of the underlying medium more appropriate for this use case than the subsurface model, where the transmission_weight mix weight selects this model rather than the opaque mix of glossy-diffuse and subsurface. This is a more traditional volumetric parametrization specifying the properties of a homogeneous medium interior to the object, with or without absorption and scattering, which is useful for modeling materials ranging from clear or colored absorbing-only glass and liquids to translucent materials with visually significant scattering such as honey, fruit juice, murky water, opalescent glass, or milky glass.

As for the dielectric slabs defined in the Glossy-diffuse section and Subsurface section, the top interface is described by a rough GGX microfacet BSDF $f_\mathrm{dielectric}$ whose "specular" parameters are described in the Dielectric base section. The bulk of the dielectric, $V^\infty_\mathrm{dielectric}$ is a volumetric medium supporting absorption and scattering: \begin{equation} S_\textrm{translucent-base} = \mathrm{Slab}(f_\mathrm{dielectric}, V^\infty_\mathrm{dielectric}) \ . \end{equation}

The index of refraction of $V^\infty_\mathrm{dielectric}$ is specified by specular_ior (as for the entire dielectric-base).

The volumetric properties of $V^\infty_\mathrm{dielectric}$ are specified as follows. The RGB transmission_color $\mathbf{T}$ and scalar transmission_depth $\lambda$ parameter pair is a commonly used artist-friendly way to set the volumetric medium extinction coefficient $\boldsymbol{\mu}_t$ (such that the Beer's law extinction produces the specified transmission color at the specified depth): \begin{equation} \boldsymbol{\mu}_t = - \frac{\ln \mathbf{T}} {\lambda} \ . \end{equation} Being a length, transmission_depth can be any value greater than or equal to zero. For convenience, we make the soft range $[0, 1]$, thus covering common cases. However when transmission_depth $\lambda$ is zero, it is assumed that the interior medium is absent ($\boldsymbol{\mu}_t=0$) and transmission_color is used instead to non-physically tint the dielectric refraction Fresnel factor multiplicatively by a constant amount (ignoring the dielectric energy balance).

The transmission_scatter parameter $\mathbf{S}$ directly sets the medium scattering coefficient $\boldsymbol{\mu}_s$ (as a multiple of the inverse transmission_depth): \begin{equation} \boldsymbol{\mu}_s = \frac{\mathbf{S}} {\lambda} \ . \end{equation} The transmission_scatter color thus controls the observed color of the single-scattered light. (Note that in the case transmission_depth $\lambda$ is zero, however, the scattering coefficient is ignored). The absorption coefficient $\boldsymbol{\mu}_a$ is then computed as \begin{equation} \boldsymbol{\mu}_a = \boldsymbol{\mu}_t - \boldsymbol{\mu}_s \ . \end{equation} If any component of $\boldsymbol{\mu}_a$ is negative, then $\boldsymbol{\mu}_a$ is shifted by enough gray to make all the components positive, i.e. (in an obvious notation): \begin{eqnarray} && \mathrm{if ;; min(\boldsymbol{\mu}_a)} < 0 \nonumber \ && \quad\quad \boldsymbol{\mu}_a \leftarrow \boldsymbol{\mu}_a - \mathrm{min}(\boldsymbol{\mu}_a) \ . \end{eqnarray} After this shifting, the final extinction coefficient is given by the new $\boldsymbol{\mu}_a + \boldsymbol{\mu}_s$. This formulation produces volumetric parameters which reproduce reasonably well the independently specified colors of the transmitted and single-scattered light. Finally the medium phase function anisotropy $g \in [-1, 1]$ is given by transmission_scatter_anisotropy (the standard Henyey-Greenstein phase function is assumed).

!!! Note: Future work The Henyey-Greenstein phase function is not ideal for representing media with both forward and back scattering lobes (as in the Mie phase function). A richer model such as [#Jendersie2023] could be considered in a future version.

![](images/transmission1.jpg width=99%) ![](images/transmission2.jpg width=99%) ![](images/transmission3.jpg width=99%)

![Figure [transmission]: The effect of **`transmission_scatter_anisotropy`**. From left to right: -0.5 (back scattering), 0 (isotropic), 0.5 (forward scattering).](dummy)

The phenomenon known as optical dispersion (i.e. variation of the IOR with wavelength) produces familiar rainbow-like colors when light refracts through dielectrics such as water, glass and diamond. Control over dispersion is grouped with the transmission parameters since this effect is only significant in highly transparent refractive media. Dispersion is parametrized by the Abbe number $V_d$, which is the ratio between differences of refractive indices at short, medium, and long wavelengths as follows: \begin{equation} V_d = \frac{n_{\mathrm{medium}} - 1}{n_{\mathrm{short}} - n_{\mathrm{long}}} \ , \end{equation} where in the standard modern definition $n_{\mathrm{long}} = n_C$, $n_{\mathrm{medium}} = n_d$ and $n_{\mathrm{short}} = n_F$ are the IORs of the material at the wavelengths of the Fraunhofer C, d, and F spectral lines (at $\lambda_C$=656.3 nm, $\lambda_d$=587.6 nm, and $\lambda_F$=486.1 nm respectively). The amount of dispersion (i.e. angular separation of colors) is roughly proportional to the reciprocal of the Abbe number. The IOR at any wavelength can be determined from the Cauchy empirical formula: \begin{equation} n(\lambda) = A + \frac{B}{\lambda^2} \ . \end{equation} It follows that if the Abbe number $V_d$ and IOR $n_d = n(\lambda_d)$ are given, the coefficients in the Cauchy formula are given by \begin{eqnarray} B &=& \frac{n_d - 1}{V_d ; (\lambda^{-2}_F - \lambda^{-2}_C)} \ , \nonumber \ A &=& n_d - \frac{B}{\lambda^2_d} \ . \end{eqnarray} We assume that specular_ior (including any modulation via specular_ior_level as in equation [modulated_ior]) defines $n(\lambda_d)$. Thus the IOR $n$ at any wavelength $\lambda$ is determined, given $V_d$. A renderer can use this known $n(\lambda)$ function to model the effect of dispersion, for example by stochastically choosing a wavelength sample and tracing the refracted ray direction according to the corresponding IOR.

However the Abbe number itself is not very intuitive to work with, as the dispersion effect increases as the Abbe number decreases (zero dispersion occurs at infinite Abbe number). We therefore prefer to use a more artist-friendly parametrization, where the Abbe number is specified by \begin{equation} V_d = \frac{\mathtt{transmission_dispersion_abbe_number}} {\mathtt{transmission_dispersion_scale}} \ . \end{equation} At the default transmission_dispersion_scale of zero, the Abbe number is infinite, which corresponds to no dispersion. At the maximum of 1, the Abbe number peaks at $V_d = \mathtt{transmission_dispersion_abbe_number}$ which defaults to 20.

The default 20 was chosen since common real materials with the highest dispersion have Abbe numbers roughly greater than or equal to this (for example, different types of glass have Abbe numbers between 20 and 91 [#Schott2023], water and diamond both have Abbe numbers between 55 and 56, while the oxide mineral rutile, composed of titanium dioxide, exhibits extremely high dispersion with an Abbe number of 9.87 [#Polyanskiy2023]). In most cases the transmission_dispersion_scale therefore functions as a convenient roughly linear slider from low to high dispersion. For those special cases where the Abbe number of a specific material is wanted, the Abbe number itself can be changed via transmission_dispersion_abbe_number.

![](images/dispersion_0percent.png width=99%) ![](images/dispersion_25percent.png width=99%) ![](images/dispersion_50percent.png width=99%) ![](images/dispersion_75percent.png width=99%) ![](images/dispersion_100percent.png width=99%)

![Figure [fuzz]: Increasing the **`transmission_dispersion_scale`** of glass from 0 to 1](dummy)
Translucent base params Label Type Range Norm Default Description
transmission_weight Weight float $ [0, 1] $ $ 0 $ Mix weight between translucent base and opaque base slabs
transmission_color Color color3 $ [0, 1]^3 $ $ (1, 1, 1) $ Transmission color, specifies the extinction of $V^\infty_\mathrm{dielectric}$
transmission_depth Depth float $ [0, \infty) $ $ [0, 1] $ $ 0 $ Distance traveled inside the medium by white light before its color becomes exactly transmission_color by Beer's law, determining the extinction coefficient of the interior medium; if zero, transmission_color acts as a constant (on-surface) transmission tint
transmission_scatter Scatter color3 $ [0, 1]^3 $ $ (0, 0, 0) $ Scattering coefficient of the interior medium
transmission_scatter_anisotropy Anisotropy float $ [-1, 1] $ $ 0 $ Anisotropy of the Henyey-Greenstein phase function of the interior medium $V^\infty_\mathrm{dielectric}$
transmission_dispersion_abbe_number Abbe number float $ [0, \infty) $ $ [9, 91] $ $ 20 $ Abbe number of the medium, inversely proportional to how much the index of refraction varies across wavelengths when transmission_dispersion_scale is 1; defaults to approximately the highest Abbe number of any real clear dielectric so that any realistic amount of dispersion can be achieved by varying transmission_dispersion_scale in $[0, 1]$
transmission_dispersion_scale Dispersion scale float $ [0, 1] $ $ 0 $ Linearly scales the amount of dispersion by setting the final Abbe number for rendering to transmission_abbe_number divided by transmission_dispersion_scale

Metal

Metals are completely opaque and have a characteristic and familiar form of specularity due to the Fresnel factor for conductors differing from that for dielectrics. The metallic base is thus represented as a separate bulk slab which consists of an opaque GGX microfacet conductor BRDF $f_\mathrm{conductor}$, whose NDF is parametrized by specular_roughness, specular_anisotropy, and specular_rotation (overloading the same parameters used for the dielectric BSDF $f_\mathrm{dielectric}$, as noted in the Microfacet model section): \begin{equation} S_\mathrm{metal} = \mathrm{Slab}(f_\mathrm{conductor}) \ . \end{equation}

The conductor Fresnel reflection curve is parametrized by the colors at normal and near-grazing incidence (base_color and specular_color respectively, scaled by the corresponding weights). This allows for art-directable variation in reflectivity toward the grazing edges by directly specifying the (texturable) colors at normal and grazing incidence to simulate the dip in reflectivity observed in real metals, or just for artistic effect [#Hoffman2019]. Note that these two color parameters are also used for the non-metallic (i.e. dielectric) specular and diffuse BRDFs, as discussed above.

As noted previously, this non-transmissive metallic base is blended as a statistical mixture with the dielectric-base according to the base_metalness parameter: \begin{eqnarray} M_\textrm{base-substrate} &=& \mathrm{\mathbf{mix}}(M_\textrm{dielectric-base}, S_\mathrm{metal}, \mathtt{M}) \ . \end{eqnarray} where $\mathtt{M} = \mathtt{base_metalness}$.

The specific model we stipulate for the metallic Fresnel effect is the "F82-tint" model of [#Kutz2021], which extends previous work by [#Hoffman2019]. This is based on the standard Schlick approximation to the metallic Fresnel factor (where $\mathbf{F}0$ is the RGB reflectivity at normal incidence i.e. base_weight * base_color, and $\mu$ is the cosine of the incident angle): \begin{equation} \mathbf{F}{\mathrm{Schlick}}(\mu) = \mathbf{F}0 + (1 - \mathbf{F}0) (1 - \mu)^5 \ . \end{equation} To better approximate the actual Fresnel curve of metals, in the F82-tint model the Schlick approximation is augmented with a correction term: \begin{equation} \mathbf{F}{82}(\mu) = \mathbf{F}{\mathrm{Schlick}}(\mu) - \frac{\mu (1 - \mu)^6}{\bar{\mu}(1 - \bar{\mu})^6} \Bigl(\mathbf{F}{\mathrm{Schlick}}(\bar{\mu}) - \mathbf{F}(\bar{\mu})\Bigr) \ . \end{equation} where $\bar{\mu} = 1/7$, and $\mathbf{F}(\bar{\mu})$ is the desired metallic reflectivity at that "grazing edge" angle cosine corresponding roughly to $82^\circ$ (i.e. around silhouettes), ensuring $\mathbf{F}{82}(\bar{\mu}) = \mathbf{F}(\bar{\mu})$. This desired edge reflectivity is user-specified as a fractional tint of the Schlick curve, i.e. \begin{equation} \mathbf{F}(\bar{\mu}) = \mathtt{specular_weight} * \mathtt{specular_color} * \mathbf{F}_\mathrm{Schlick}(\bar{\mu}) \ . \end{equation} This formulation has the useful property that it reduces to the regular Schlick reflectivity at the default values of $\mathtt{specular_weight}$ and $\mathtt{specular_color}$. Note that the edge cannot be brighter than the standard Schlick term, but this is generally true in real metals. We consider this a benefit of this parametrization, as it makes it impossible to produce physically implausible metals with excessively bright edges.

!!! Note: Future work The metallic Fresnel should ideally take into account the effective coat IOR given by equation [effective_coat_ior], as the dielectric BSDF does. But the current models don't allow for a varying IOR of the surrounding medium unfortunately. It is also not clear if taking it into account would cause a significant visual difference.

Metal params Label Type Range Norm Default Description
base_weight Weight float $ [0, 1] $ $ 1 $ Scalar multiplier to base_color
base_color Color color3 $ [0, 1]^3 $ $ (0.8, 0.8, 0.8) $ Color of Fresnel reflection albedo at normal incidence, $\mathbf{F}_0$
specular_weight Weight float $ [0, 1] $ $ 1 $ Scalar multiplier to specular_color
specular_color Color color3 $ [0, 1]^3 $ $ (1, 1, 1) $ Tint color of Fresnel reflection albedo at near-grazing incidence (i.e. around silhouettes)
specular_roughness Roughness float $ [0, \infty) $ $ [0, 1] $ $ 0.3 $ Roughness of NDF of conductor BRDF $f_\mathrm{conductor}$
specular_anisotropy Anisotropy float $ [0, 1] $ $ 0 $ Anisotropy of NDF of conductor BRDF $f_\mathrm{conductor}$
specular_rotation Rotation float $ [0, 1] $ $ 0 $ Orientation of roughness anisotropy

![](images/metal_with_default_edge_tint.png width=90% align=right) ![](images/metal_with_correct_edge_tint.png width=90% align=left)

![Figure [metal]: Metals produced (in **`base_metalness`=1** mode) by setting only the **`base_color`** parameter (left) compared with metals produced by correctly setting both the **`base_color`** and **`specular_color`** parameters (right)](dummy)

Coat

The coat slab is a layer of dielectric that transmits light without scattering, but with possible absorption. This is intended to support the appearance of objects with a coat of colored varnish or lacquer: \begin{equation} S_\mathrm{coat} = \mathrm{Slab}(f_\mathrm{coat}, V_\mathrm{coat}) \ . \end{equation} The BSDF of the interface $f_\mathrm{coat}$ is that of a GGX microfacet dielectric parametrized by coat_roughness, coat_anisotropy, and coat_rotation (see the Microfacet model section). The IOR coat_ior of this dielectric layer is distinct from that of the base dielectric, as described below (modulated by coat_ior_level in a similar fashion to specular_ior_level described in the Dielectric base section). There is also assumed to be an embedded purely absorbing medium $V_\mathrm{coat}$.

The coat is applied on top of the base substrate, with a coverage weight $\mathtt{C}$ = coat_weight as follows: \begin{equation} M_\textrm{coated-base} = \mathrm{\mathbf{layer}}(M_\textrm{base-substrate}, S_\textrm{coat}, \mathtt{C}) \ . \end{equation}


  • +-------------------------------------------------+ *
  • | coat | *
  • +-------------------------------------------------+ *
  • | base-substrate | *
  • +-------------------------------------------------+ *

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. 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).

In the full light transport this observed color is further darkened and saturated due to multiple internal reflections from the inside of the coat, including a considerable amount of total internal reflection, which causes light to strike the underlying material multiple times and undergo more absorption. Also the observed tint color should vary away from coat_color as the incidence angle changes, due to the change in path length in the medium. The presence of a rough coat will increase the apparent roughness of the BSDF lobes of the underlying base. We generally assume that in the ground truth appearance, all these effects are accounted for.

In reality, coats can darken the underlying surface also due to a different mechanism where the coat modifies the Fresnel factor of the base due to filling in air gaps between granules or threads, 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, 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.

We leave it up to the implementation to decide what level of approximation to use for this (in the simplest approximation, the coat_color can just be multiplied into the substrate lobes).

The IOR of the coat medium $V_\mathrm{coat}$, controlled by the coat_ior parameter, will alter the Fresnel factor of both the coat top interface and the underlying metal or dielectric. The coat_ior_level parameter in $[0, 1]$ modulates the coat top interface Fresnel reflectivity (at normal incidence) to zero at the minimum and double the original reflectivity at the maximum. This works similarly to the formula for specular_ior_level in equation [modulated_ior]. In detail, the coat Fresnel reflection factor at normal incidence is given by \begin{equation} F_c = \frac{|\eta_c - 1|^2}{(\eta_c + 1)^2} \ . \end{equation} where $\eta_c = n_\mathrm{coat} / n_\mathrm{ambient}$ (with $n_\mathrm{coat} = \mathtt{coat_ior}$, $n_\mathrm{ambient}$ = $\mathtt{ambient_ior}$). The factor $F_c$ is then modulated by multiplying by twice $\xi_c = \mathtt{coat_ior_level}$, giving the new IOR ratio $\eta^\prime_c$ after the modulation: \begin{equation} \label{modulated_coat_ior} \eta^\prime_c = \frac{1 + \mathrm{sgn}(\eta_c-1)\sqrt{2, \xi_c F_c}}{1 - \mathrm{sgn}(\eta_c-1)\sqrt{2, \xi_c F_c}} \ , \end{equation} where the range of $\xi_c$ is clamped according to $\xi_c \in [0, \mathrm{min}(1, 1/(2 F_c)]$. Inserting this modulated IOR ratio $\eta^\prime_c$ in the coat Fresnel factor then produces the desired reflectivity modulation.

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 (the fuzz layer can be assumed to have the ambient IOR $n_\mathrm{ambient}$). A reasonable approximation of this is to take the surrounding effective coat IOR to be a linear blend 3 between the ambient and modulated coat IORs according to the coat weight: \begin{equation} \label{effective_coat_ior} n_\mathrm{coat} = n_\mathrm{ambient} ; \mathrm{lerp}(1, \eta^\prime_c, \mathtt{C}) \ . \end{equation}

The ratio between the specular IOR ($n_\mathrm{specular} = \mathtt{specular_ior}$) and the coat IOR, $\eta_s = n_\mathrm{specular} / n_\mathrm{coat}$ then determines the specular Fresnel factor, as in equation [modulated_ior].

Coat params Label Type Range Norm Default Description
coat_weight Weight float $ [0, 1] $ $ 0 $ Coverage weight of coat slab
coat_color Color color3 $ [0, 1]^3 $ $ (1, 1, 1) $ Square of normal-incidence transmittance of $V_\mathrm{coat}$
coat_roughness Roughness float $ [0, \infty) $ $ [0, 1] $ $ 0 $ Roughness of NDF of coat BSDF $f_\mathrm{coat}$
coat_anisotropy Anisotropy float $ [0, 1] $ $ 0 $ Anisotropy of NDF of coat BSDF $f_\mathrm{coat}$
coat_rotation Rotation float $ [0, 1] $ $ 0 $ Orientation of roughness anisotropy
coat_ior IOR float $ (0, \infty) $ $ [1, 3] $ $ 1.6 $ Refractive index of $V_\mathrm{coat}$
coat_ior_level IOR level float $ [0, 1] $ $ 0.5 $ Modulates the coat reflectivity at normal incidence between zero and double the original

![](images/coat_0.png width=90% align=right) ![](images/coat_1.png width=90% align=left)

![Figure [coat]: Coat adds a secondary specular highlight and optional absorption tint](dummy)

Fuzz

The topmost scattering layer supports the appearance of textiles, "fuzzy" surfaces, or dusty surfaces, where the surface consists of opaque colored fibers oriented with axes primarily parallel to the surface normal, producing a specular highlight at grazing angles.

\begin{equation} S_\textrm{fuzz} = \mathrm{Slab}(f_\mathrm{fuzz}, V_\mathrm{fuzz}) \ . \end{equation}

Conceptually the fibers will cover only some fraction of the surface, which is represented by a cover operation with the coverage weight $\mathtt{F}$ = fuzz_weight: \begin{equation} M_\mathrm{surface} = \mathrm{\mathbf{layer}}(M_\textrm{coated-base}, S_\mathrm{fuzz}, \mathtt{F}) \ . \end{equation}


  • +-------------------------------------------------+ *
  • | fuzz | *
  • +-------------------------------------------------+ *
  • | coated-base | *
  • +-------------------------------------------------+ *

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

The form of this model is the following (with $\mu_i, \mu_o$ the angle cosines to the normal of $\omega_i, \omega_o$): \begin{equation} \mu_i , f_\mathrm{fuzz}(\omega_i, \omega_o) = \mathbf{F} , E_\mathrm{fuzz}(\mu_o, \alpha) , D(\mu_i | \mu_o, \alpha) \end{equation} where $\mathbf{F}$ = fuzz_color, $E_\mathrm{fuzz}(\mu_o, \alpha)$ (termed $R$ in [#Zeltner2022]) is the reflectance at angle cosine $\mu_o$ given roughness $\alpha$ = fuzz_roughness $\in [0,1]$, and $D(\mu_i | \mu_o, \alpha)$ is a lobe defined by linear transformations of a cosine lobe (LTCs), where the transformation matrices (and $E_\mathrm{fuzz}$) are tabulated in a grid in the $(\mu_o, \alpha)$ plane, with values fitted to a simulation of the scattering in the volumetric fuzz microflake layer. Since the LTC lobe $D$ is a normalized PDF over the hemisphere, the resulting albedo of $f_\mathrm{fuzz}$ is $\mathbf{F} , E_\mathrm{fuzz}(\mu_o, \alpha)$.

If using the albedo-scaling interpretation of layering, a reasonable approximation of the reflection from the fuzz layer combined with the reflection from the base is to take \begin{eqnarray} \mathrm{\mathbf{layer}}(M_\textrm{coated-base}, S_\mathrm{fuzz}) &\rightarrow& f_\mathrm{fuzz} + \bigl(1 - E_\mathrm{fuzz} \bigr) ,f_\textrm{coated-base} \ , \end{eqnarray} 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} \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 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.

Fuzz params Label Type Range Default Description
fuzz_weight Weight float $ [0, 1] $ $ 0 $ Coverage weight of fuzz slab
fuzz_color Color color3 $ [0, 1]^3 $ $ (1, 1, 1) $ Reflection albedo color of $f_\mathrm{fuzz}$
fuzz_roughness Roughness float $ [0, 1] $ $ 0.5 $ Reflection roughness of $f_\mathrm{fuzz}$

![](images/fuzz1.jpg width=99%) ![](images/fuzz2.jpg width=99%) ![](images/fuzz3.jpg width=99%)

![Figure [fuzz]: Various textiles rendered using fuzz.](dummy)

Emission

It is assumed that the base substrate below the coat may emit light, with a directionally uniform EDF. One can image the light being emitted from the interior of the base substrate with an isotropic luminance given by $L_e$.

We put emission below the coating so that emitted light will be tinted due to the absorption in the coat and fuzz layers. This allows for the convenient rendering of low-emission materials that are bounded by a reflective surface (e.g. glow sticks, LEDs, display screens, etc.) without explicit modeling of the emitter and the bounding object.


  •                          emission               *
    
  •                              ^                  *
    
  • +--------------------------------|----------------+ *
  • | fuzz | | *
  • +--------------------------------|----------------+ *
  • | coat | | *
  • +--------------------------------*----------------+ *
  • | base-substrate | *
  • +-------------------------------------------------+ *

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).

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.

Being an intensity, emission_luminance can be any value greater than or equal to zero. For convenience, we make the soft range $[0, 1000]$, corresponding to the typical range of home appliances.

!!! Note: Future work There is an ongoing discussion in the MaterialX and USD working groups regarding the description of lights and emissive objects. This part of the specification may be subject to change if it doesn't align with those standards. Moreover, a richer emission model such as the one described in the MaterialX specification could be considered in a future version of OpenPBR, but would require a more detailed description of the EDF.

In addition, the transmittance of the EDF through the coat and fuzz is currently underspecified.

Emission params Label Type Range Norm Default Description
emission_luminance Luminance float $ [0, \infty) $ $ [0, 1000] $ $ 0 $ Emission luminance, in cd/m^2 (aka. nits)
emission_color Color color3 $ [0, 1]^3 $ $ (1, 1, 1) $ Emission color multiplier

![](images/emitting_lava.png width=90% align=left) ![](images/emission_under_coat.png width=90% align=right)

![Figure [coat]: Left: A texture map representing hot lava connected to **`emission_color`**. Right: Emission from under an absorbing coat (driven by **`coat_color`**) acting like a dark mask with colored inserts.](dummy)

Opacity / Transparency

The final surface is defined as a mix of the entire $\mathrm{surface}$ bulk with the ambient medium: \begin{equation} M_\mathrm{PBR} = \mathrm{\mathbf{mix}}(S_\mathrm{ambient; medium}, M_\mathrm{surface}, \mathtt{\alpha}) \end{equation} where $\mathtt{\alpha} = \mathtt{geometry_opacity}$ is the presence weight of the entire surface, thus functioning effectively as a linear "alpha blend".


  •                                             1 - geometry_opacity       geometry_opacity      *
    
  • +-----------------------------------+ +------------------------+------------------------+ *
  • | | | | | *
  • | PBR | == | ambient medium | surface | *
  • | | | | | *
  • +- - - - - - - - - - - - - - - - - -+ +- - - - - - - - - - - - + - - - - - - - - - - - -+ *

Note that in the case of a non-thin-walled material, $\mathtt{\alpha} &lt; 1$ doesn't make strict physical sense unless the entire surface is removed, whereas in the thin-walled case 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.

The computed transmittance should take into account the presence weight of the entire geometry (geometry_opacity), and the transmittance through the geometry if present. The latter is the transmittance through the base dielectric only (as the metal is opaque), denoted $\mathbf{T}\mathrm{dielectric}$, which should take into account the Fresnel factor of the dielectric interface and the extinction in the volumetric media (in general a statistical mixture of the subsurface medium $V^\infty\mathrm{subsurface}$ and translucent-base medium $V^\infty_\mathrm{dielectric}$). The mix weight of the base dielectric is $w_\mathrm{dielectric} = 1 - \mathtt{M}$ where $\mathtt{M} = \mathtt{base_metalness}$. The total transmittance can thus be approximated as 3 \begin{eqnarray} \mathbf{T}\mathrm{pbr} &=& \mathrm{lerp}(1, w\mathrm{dielectric} \mathbf{T}\mathrm{dielectric}, \mathtt{\alpha}) \nonumber \ &=& 1 - \mathtt{\alpha} \bigl(1 - (1 - M) \mathbf{T}\mathrm{dielectric}\bigr) \ . \end{eqnarray}

Opacity params Label Type Range Default Description
geometry_opacity Opacity float $ [0, 1] $ $ 1 $ Opacity of the surface

![](images/leaf_alpha.png width=90%) ![](images/leaf_texture.jpg width=90%) ![](images/leaf-rendered-driving-the-opacity-using-a-mask.jpg width=90%)

![Figure [opacity]: Alpha map driving **`geometry_opacity`**, texture map (driving e.g. **`base_color`**), and rendered leaf.](dummy)

Normal maps

The geometry of the surface is assumed to be given externally to the model, defining a local unperturbed shading normal and tangent space frame.

However we allow for normal mapping, which (optionally) alters this unperturbed shading frame, as a part of the material model, as this alters the light transport and appearance fundamentally.

There are assumed to be separate normal inputs geometry_normal, geometry_coat_normal defining the perturbation of the shading normal for the base and coat BSDF models. Separately perturbing the coat normal allows for the appearance of a finite thickness coat on top of the base.

The geometry_tangent may also be specified, which controls the direction of microfacet anisotropy, for effects such as brushed metal. The base and coat are assumed to share the tangent, which is orthonormalized accordingly.

The perturbed normals and tangent will of course be specified by input textures (or possibly procedurally). As noted in the Metadata section, the particular parametrization which maps the contents of the texture to the perturbation of the normal in the shading frame is not defined in the model itself, as this can be done in multiple ways. It is instead just assumed that the material is packaged with metadata that makes this mapping unambiguous.

Thin-walled case

If the geometry_thin_walled Boolean is enabled, then the surface is assumed to be in a "thin-walled" mode.

In this case we make the assumption that the surface is essentially the bulk structure but mirrored around the base, with the slabs at the base assumed to be thin enough that macroscopically the material can be treated as a 2d sheet with no interior. This sheet thus appears identical viewed from either side:


  •                                                                                  ^ emission             *
    
  • +-----------+-----------------------------------------------------------------------|------+ *
  • | | fuzz | | *
  • | +-----------------------------------------------------------------------|------+ *
  • | | coat | | *
  • | +---------------------+----------------------+----------------+---------+------+ <-- thin-film *
  • | |░░░░░░░░░░░░░░░░░░░░░| | |░░░░░░░░░░░░░░░░| *
  • | |░░░░░░░ metal ░░░░░░░| translucent-base | subsurface |░glossy-diffuse░| *
  • | |░░░░░░░░░░░░░░░░░░░░░| | |░░░░░░░░░░░░░░░░| *
  • | +---------------------+----------------------+----------------+---------+------+ <-- thin-film *
  • | | coat | | *
  • | ambient +-----------------------------------------------------------------------|------+ *
  • | medium | fuzz | | *
  • +-----------+-----------------------------------------------------------------------|------+ *
  •                                                                                  v emission             *
    

A convenient rough approximation of this is to ignore the coat and fuzz layers on the underside, and assume that the surface is automatically oriented so that the incident ray is always entering the surface from the top, so the surface appears the same viewed from above or below. Though a crude approximation, this is quite convenient as the light transport can always be dealt with essentially the same as in the bulk case except with a modified base layer (i.e. incident rays enter top-down, and leave from the base layer without further interaction).

A more general interpretation would be to allow each side of the thin-wall to be defined by a distinct thin-walled OpenPBR Surface (one associated to the top, in the direction of the normal, and one to the bottom in the opposite direction) so that the thin base slabs meet in the middle. Then if there are different translucent-base or subsurface parameters on each side, these need to be resolved somehow (e.g. the parameters could be blended, or the light transport could model the presence of the two distinct thin layers of dielectric). If this is supported, we assume it is dealt with in a renderer-specific fashion by assigning separate shaders to each side.

In the thin-wall structure, the base slabs are interpreted as infinitesimally thin sheets, thus their behavior is assumed to change as follows:

  • As noted above, geometry_opacity makes physical sense as a fractional value in the thin-walled case (unlike the bulk case), controlling the overall presence weight of the thin wall.

  • The $\textrm{metal}$ and $\textrm{glossy-diffuse}$ slabs remain but are considered double-sided, with the top BSDF mirrored to the bottom (and a totally opaque, albeit infinitesimally thin, interior).

  • The $\textrm{translucent-base}$ slab can be considered an infinitesimally thin sheet of dielectric (absorbing but non-scattering), with the BSDF $f_\mathrm{dielectric}$ on both sides. A ladder of inter-reflections occurs inside this slab producing a reflected lobe and un-deflected refracted lobe. The transmission_color can be assumed to give the transmittance through the thin sheet at normal incidence (due to absorption). In the smooth case the BRDF and BTDF of this sheet can be solved exactly by summing over a geometrical series of terms containing Fresnel and absorption factors, and this can be extended to a good approximation of the rough case by appropriately roughening the transmission lobe (as described in [#Kulla2017]). This model of thin-walled glass is a cheaper, much more convenient way to render windows than a finite thickness non-thin-walled mesh.

  • The $\textrm{subsurface}$ slab is considered to degenerate into an infinitesimally thin sheet of dense scattering material (bounded by dielectric interfaces $f_\mathrm{dielectric}$), which scatters a fraction $S = \texttt{subsurface_color}$ of the incident light, split between a diffuse reflection lobe $f^R_\mathrm{diffuse}$ and diffuse transmission lobe $f^T_\mathrm{diffuse}$ according to $g = \texttt{subsurface_anisotropy} \in [-1, 1]$. That is, where $f_+$, $f_-$ are albedo 1 diffuse lobes in the positive and negative hemisphere respectively: \begin{eqnarray} f^R_\mathrm{diffuse} &=& \frac{1}{2} S (1 - g), f_+ \ , \nonumber \ f^T_\mathrm{diffuse} &=& \frac{1}{2} S (1 + g), f_- \ . \label{thin_wall_subsurface} \end{eqnarray} This form ensures total energy conservation, i.e. the sum of the reflection and transmission albedos is less than 1: \begin{equation} E_R[f^R_\mathrm{diffuse}] + E_T[f^T_\mathrm{diffuse}] = S \le 1 \ . \end{equation} At the default of zero anisotropy ($g=0$) the energy is balanced equally between diffuse reflection and transmission. The diffuse transmission lobe shape (in both hemispheres) is assumed to be controlled by the base_roughness parameter. Typically the diffuse lobes $f_+$, $f_-$ will be represented by an Oren-Nayar lobe flipped into the appropriate hemisphere (which technically should be modified due to the dielectric boundaries, though a renderer may choose to ignore this). This model is useful for rendering cases such as light scattering through a thin sheet of paper (Figure [thinwalled]).

![](images/thin_walled1.jpg width=99% align=right) ![](images/thin_walled2.jpg width=99% align=left)

![Figure [thinwalled]: Opaque paper plane (left) vs diffuse transmission enabled via subsurface in thin-walled mode (right)](dummy)

!!! Note: Future work It is an open question as to what the best default interpretation of the thin-walled structure is, and what other structures we might need to specify to cover the common use cases.

!!! Note: Future work The thin-walled limit of the subsurface slab has been introduced as a convenient, slightly more physically based model than the diffuse-transmission of the Autodesk Standard Surface. It does not really correspond to the thin-walled limit of a volumetric medium (bounded by dielectrics) though. The thin-walled limit of the translucent slab described above is closer to that, though it explicitly ignores scattering. It might be worth attempting to unify these two representations into a single thin-wall dielectric volume model.

Reduction to a mixture of lobes

In various practical models such as Disney's Principled Shader [#Burley2012], Autodesk 3ds Max's Physical Material [#Andersson2016] and Autodesk Standard Surface [#Georgiev2019], the model is defined as a mixture (i.e. linear combination) of BSDF/BSSRDFs corresponding to the constituent BSDF lobes of the reflection and transmission. The light transport between the layers and overall energy balance is approximated via the mix weights. Given such a representation, the integration into a renderer is relatively straightforward as the individual lobes can be importance sampled according to their albedos and combined with direct lighting estimates via standard techniques such as multiple importance sampling (MIS) [#Veach1997].

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.

Consider first the non-thin-walled case (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 \ \mathtt{F} &=& \mathtt{fuzz_weight} \nonumber \ \mathtt{C} &=& \mathtt{coat_weight} \nonumber \ \mathtt{M} &=& \mathtt{base_metalness} \nonumber \ \mathtt{T} &=& \mathtt{transmission_weight} \nonumber \ \mathtt{S} &=& \mathtt{subsurface_weight} \nonumber \ \end{eqnarray}

The base substrate is a mix which can be mapped to a BSDF as follows (where the $\color{darkblue}{\mathrm{blue}}$ color indicates a primitive BSDF lobe): \begin{equation} f_\textrm{base-substrate} = \mathrm{lerp}\left(f_\textrm{dielectric-base}, \color{darkblue}{f_\mathrm{conductor}}, \mathtt{M}\right) \ . \end{equation} Similarly the dielectric-base mix can be written: \begin{equation} f_\textrm{dielectric-base} = \mathrm{lerp}\left(f_\textrm{opaque-base}, f_\textrm{translucent-base}, \mathtt{T}\right) \ , \end{equation} and the opaque-base mix as \begin{equation} f_\textrm{opaque-base} = \mathrm{lerp}\left(f_\textrm{glossy-diffuse}, f_\textrm{subsurface}, \mathtt{S}\right) \ . \end{equation} All of $f_\textrm{translucent-base}$, $f_\textrm{subsurface}$ and $f_\textrm{glossy-diffuse}$ represent the BSDF of a microfacet dielectric interface bounding the dielectric interior and its volumetric media. In each case the BSDF can be represented as the sum of a "primary specular" BRDF $\color{darkblue}{f^R_\textrm{specular}}$ corresponding to reflection from the dielectric surface without interaction with the internal medium, and a substrate lobe corresponding to the effect of transmission into and scattering within the medium: \begin{align} f_\textrm{translucent-base} &= \color{darkblue}{f^R_\textrm{specular}} + !!!!!!!!!! &(1 - E[\color{darkblue}{f^R_\textrm{specular}}]) &,\color{darkblue}{f^T_\textrm{specular}} \ , \nonumber \ f_\textrm{subsurface} &= \color{darkblue}{f^R_\textrm{specular}} + !!!!!!!!!! &(1 - E[\color{darkblue}{f^R_\textrm{specular}}]) &,\color{darkblue}{f_\textrm{SSS}} \ , \nonumber \ f_\textrm{glossy-diffuse} &= \color{darkblue}{f^R_\textrm{specular}} + !!!!!!!!!! &(1 - E[\color{darkblue}{f^R_\textrm{specular}}]) &,\color{darkblue}{f_\mathrm{diffuse}} \ . \end{align} where, as described in the Slabs section, $E[f_X]$ denotes the directional albedo of $f_X$.

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. 6 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_weight and specular_color.

Since $\color{darkblue}{f^R_\textrm{specular}}$ appears in each of the three components slab of the dielectric base, it follows that on collecting terms, $f_\textrm{dielectric-base}$ reduces to: \begin{equation} f_\textrm{dielectric-base} = \color{darkblue}{f^R_\textrm{specular}} + (1 - E[\color{darkblue}{f^R_\textrm{specular}}]) ,f^T_\mathrm{dielectric-base} \ , \end{equation} where $f^T_\mathrm{dielectric-base}$, the total effective transmission lobe of the dielectric-base, is: \begin{align} f^T_\mathrm{dielectric-base} &= \mathtt{T} \color{darkblue}{f^T_\textrm{specular}} + (1 - \mathtt{T}) \left(\mathtt{S} ,\color{darkblue}{f_\textrm{SSS}} + (1 - \mathtt{S}) ,\color{darkblue}{f_\mathrm{diffuse}}\right) \nonumber \ &= \mathrm{lerp}\left(\mathrm{lerp}(\color{darkblue}{f_\mathrm{diffuse}}, \color{darkblue}{f_\textrm{SSS}}, \mathtt{S}), \color{darkblue}{f^T_\textrm{specular}}, \mathtt{T}\right) \ . \end{align}

Next, the coat is layered on top of the base substrate with the coverage weight $\mathtt{C}$, where the BRDF of the coat dielectric interface is taken to be $\color{darkblue}{f_\mathrm{coat}}$, with a transmittance $T_\mathrm{coat}$. As in equation [coat_layering_formula_with_albedo_scaling], this can be expressed as: \begin{equation} f_\mathrm{coated-base} = \mathtt{C} ,\color{darkblue}{f_\mathrm{coat}} + \mathrm{lerp}\left(1, T_\mathrm{coat} (1 - E[\color{darkblue}{f_\mathrm{coat}}]), \mathtt{C}\right) f_\textrm{base-substrate} \ . \end{equation}

Similarly, the fuzz layer is applied with coverage weight $\mathtt{F}$ (with albedo-scaling adjusted to account for the gray transmission, according to equation [fuzz-layering-approx]), producing (where $\color{darkblue}{\overline{f_\mathrm{fuzz}}}$ is the fuzz BRDF with the tint color set to white): \begin{equation} f_\mathrm{surface} = \mathtt{F} ,\color{darkblue}{f_\mathrm{fuzz}} + \mathrm{lerp}\left(1, 1 - E[\color{darkblue}{\overline{f_\mathrm{fuzz}}}], \mathtt{F}\right) f_\textrm{coated-base} \ . \end{equation}

Finally, the opacity mix operation is applied producing: \begin{equation} f_\mathrm{PBR} = \mathtt{\alpha} ,f_\mathrm{surface} + (1 - \mathtt{\alpha}) ,\color{darkblue}{f_\textrm{transparent}} \end{equation} where $\color{darkblue}{f_\textrm{transparent}}$ is understood to denote a delta-function BSDF corresponding to the absence of any surface interaction.

If $\mathtt{E}$ represents the isotropic emission luminance from the base, then the total EDF lobe $\color{darkblue}{L_e}$ can be modeled according to the absorption in the coat layer as: \begin{eqnarray} \color{darkblue}{L_e} &=& (1 - \mathtt{C}) ,\mathtt{E} + \mathtt{C} ,T_\mathrm{coat} \mathtt{E} \nonumber \ &=& \mathrm{lerp}\left(1, T_\mathrm{coat}, \mathtt{C}\right) \mathtt{E} \ . \end{eqnarray} which in principle is a function of direction due to the varying transmittance. This can also be thought of as a lobe in its own right (representing light self-emitted, rather than reflected or transmitted).

To summarize, we have thus expressed the model as the following linear combination of component BRDF/BTDF/BSSRDF lobes (and a separate EDF lobe): \begin{equation} \color{red} { \boxed{ \color{black}{ \begin{aligned} ; f_\mathrm{PBR} &=& !!!!!!!!!! &\mathrm{lerp}\left(\color{darkblue}{f_\textrm{transparent}}, f_\mathrm{surface} , \mathtt{\alpha}\right) \ , ; \nonumber \ ; f_\mathrm{surface} &=& !!!!!!!!!!\mathtt{F} ,\color{darkblue}{f_\mathrm{fuzz}} + &\mathrm{lerp}\left(1, \quad\quad; 1 - E[\color{darkblue}{\overline{f_\mathrm{fuzz}}}] , ;\mathtt{F} \right) f_\textrm{coated-base} \ , ; \nonumber \ ; f_\mathrm{coated-base} &=& !!!!!!!!!!\mathtt{C} ,\color{darkblue}{f_\mathrm{coat}} + &\mathrm{lerp}\left(1, T_\mathrm{coat} (1 - E[\color{darkblue}{f_\mathrm{coat}}]) , \mathtt{C} \right) f_\textrm{base-substrate} \ , ; \nonumber \ ; \color{darkblue}{L_e} &=& !!!!!!!!!! &\mathrm{lerp}\left(1, T_\mathrm{coat} , \mathtt{C} \right) \mathtt{E} \ , ; \nonumber \ ; f_\textrm{base-substrate} &=& !!!!!!!!!! &\mathrm{lerp}\left(f_\textrm{dielectric-base}, \color{darkblue}{f_\mathrm{conductor}} , \mathtt{M} \right) \ , ; \nonumber \ ; f_\textrm{dielectric-base} &=& !!!!!!!!!!\color{darkblue}{f^R_\textrm{specular}} + &(1 - E[\color{darkblue}{f^R_\textrm{specular}}]) f^T_\mathrm{dielectric-base} \ , ; \nonumber \ ; f^T_\mathrm{dielectric-base} &=& !!!!!!!!!! &\mathrm{lerp}(\mathrm{lerp}(\color{darkblue}{f_\mathrm{diffuse}}, \color{darkblue}{f_\textrm{SSS}}, \mathtt{S}), \color{darkblue}{f^T_\textrm{specular}}, \mathtt{T}) \ . ; \end{aligned} } } } \end{equation}

Where the component lobes are listed below.

Lobe name Lobe symbol Description parameters
Transparency $\color{darkblue}{f_\textrm{transparent}}$ pass-through (delta BTDF) as in the Opacity / Transparency section
Coating $\color{darkblue}{f_\mathrm{coat}}$ coat BRDF as in the Coat section
Emission $\color{darkblue}{L_e}$ emission EDF as in the Emission section
Metal $\color{darkblue}{f_\mathrm{conductor}}$ metal BRDF as in the Metal section
Specular reflection $\color{darkblue}{f^R_\textrm{specular}}$ specular BRDF as in the Dielectric-base section
Specular transmission $\color{darkblue}{f^T_\textrm{specular}}$ specular BTDF/BSSRDF as in the Translucent-base section
Fuzz $\color{darkblue}{f_\mathrm{fuzz}}$ fuzz BRDF as in the Fuzz section
Subsurface scattering $\color{darkblue}{f_\textrm{SSS}}$ subsurface BSSRDF as in the Subsurface section
Diffuse reflection $\color{darkblue}{f_\mathrm{diffuse}}$ diffuse BRDF as in the Glossy-diffuse section

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:

  • 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.

  • The subsurface lobe $\color{darkblue}{f_\textrm{SSS}}$ degenerates into diffuse reflection and transmission lobes ${f^R_\textrm{diffuse}}$, ${f^T_\textrm{diffuse}}$ as given in equation [thin_wall_subsurface].

The full representation in code of this linear combination of BRDF/BTDF/BSSRDF lobes will depend on renderer-specific details.

MaterialX reference implementation

We provide a reference implementation in MaterialX, which is based on the derivation in the previous section and the implementation of Autodesk Standard Surface [#Georgiev2019].

!!! Note: Future work Our MaterialX implementation is as faithful to the OpenPBR specification as existing shading languages (e.g. OSL, MDL) support. Thus it is still missing certain features, i.e.: - the microfacet NDF anisotropy formula of the Microfacet model section - the F82-tint conductor Fresnel model of the Metal section - the remapping logic described in the Subsurface section - the volumetric medium of the Translucent base section - the dispersion scaling logic of the Translucent base section - the thin-walled glass model of the Thin-walled case section - the specific fuzz model (of [#Zeltner2022]) specified in the Fuzz section - correct normal map blending for the Fuzz model Additional improvements to achieve this functionality will require in some cases industry-wide adoption of these features, not merely new MaterialX features.

(insert parametrization.md.html here)

Conclusion

In this document we have given a specification of a standard, generic surface shader for use in a wide variety of production rendering contexts. We described in detail the structure of the material in terms of physical slabs composed together via layering and mixing operations, controlled by a suite of well-defined and artist-friendly parameters.

We hope this proposal serves as a useful basis for an industry standard surface shader implementation and asset exchange format.

Acknowledgements

The authors would like to thank François Beaune, Henrik Edstrom, Iliyan Georgiev, Lee Griggs, Niklas Harrysson, Miloš Hašan, Anders Langlands, Nikie Monteleone, Michael Nickelsky, Guido Quaroni, Nathan Reed, Anthony Salvi, Lukas Stockner, Jonathan Stone and Brecht van Lommel for their contribution.

References

[#Andersson2016]: Zap Andersson. Physical Material, Autodesk white paper (2016).

[#Ashikhmin2000]: Michael Ashikhmin, Simon Premože, and Peter Shirley. A Microfacet-based BRDF Generator, ACM Transactions on Graphics (2000).

[#Belcour2017]: Laurent Belcour and Pascal Barla. A Practical Extension to Microfacet Theory for the Modeling of Varying Iridescence, ACM Transactions on Graphics (2017).

[#Belcour2018]: Laurent Belcour. Efficient Rendering of Layered Materials using an Atomic Decomposition with Statistical Operators, ACM Transactions on Graphics (2018).

[#Budge2002]: Brian Budge. Simple Nested Dielectrics in Ray Traced Images, Journal of Graphics Tools (2002).

[#Burley2012]: Brent Burley. Physically Based Shading at Disney, ACM SIGGRAPH Courses: Practical Physically Based Shading in Film and Game Production (2012).

[#Burley2018]: Brent Burley, David Adler, Matt Jen-Yuan Chiang, Hank Driskill, Ralf Habel, Patrick Kelly, Peter Kutz, Yining Karl Li, Daniel Teece. The Design and Evolution of Disney’s Hyperion Renderer, ACM TOG (2018).

[#Conty2017]: Alejandro Conty Estevez and Christopher Kulla Production Friendly Microfacet Sheen BRDF, Sony Pictures Imageworks technical report (2017).

[#d'Eon2021]: Eugene d’Eon. A Hitchhiker’s guide to multiple scattering: Exact Analytic, Monte Carlo and Approximate Solutions in Transport Theory (2022).

[#d'Eon2023]: Eugene d’Eon. Student-T and Beyond: Practical Tools for Multiple-Scattering BSDFs with General NDFs, ACM SIGGRAPH Talks (2023).

[#Georgiev2019]: Iliyan Georgiev, Jamie Portsmouth, Zap Andersson, Adrien Herubel, Alan King, Shinji Ogaki, and Frederic Servant. Autodesk Standard Surface, Autodesk white paper (2019).

[#Gritz2010]: Larry Gritz, Clifford Stein, Chris Kulla, and Alejandro Conty. Open Shading Language, ACM SIGGRAPH Talks (2010).

[#Heitz2014a]: Eric Heitz, Eugene d’Eon. Importance Sampling Microfacet-Based BSDFs using the Distribution of Visible Normals, Computer Graphics Forum (2014).

[#Heitz2014b]: Eric Heitz. Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs, Journal of Computer Graphics Techniques (2014).

[#Heitz2015]: Eric Heitz, Jonathan Dupuy, Cyril Crassin, Carsten Dachsbacher. The SGGX microflake distribution, ACM Transactions on Graphics (2015).

[#Heitz2016a]: Eric Heitz, Johannes Hanika, Eugene d’Eon and Carsten Dachsbacher. Multiple-Scattering Microfacet BSDFs with the Smith Model, ACM Transactions on Graphics (2016).

[#Heitz2016b]: Eric Heitz, Jonathan Dupuy, Stephen Hill and David Neubelt. Real-Time Polygonal-Light Shading with Linearly Transformed Cosines, ACM SIGGRAPH (2016).

[#Hery2017]: Christophe Hery, Ryusuke Villemin, Junyi Ling. Pixar's Foundation for Materials, Pixar technical report (2017).

[#Hoffman2019]: Naty Hoffman. Fresnel Equations Considered Harmful, EGSR (2019).

[#Jakob2014]: Wenzel Jakob, Eugene d'Eon, Otto Jakob, and Steve Marschner. A Comprehensive Framework for Rendering Layered Materials, ACM Transactions on Graphics (2014).

[#Jendersie2023]: Johannes Jendersie and Eugene d'Eon. An Approximate Mie Scattering Function for Fog and Cloud Rendering, ACM SIGGRAPH (2023).

[#Jensen2001]: Henrik Wann Jensen, Stephen R. Marschner, Marc Levoy, and Pat Hanrahan. A Practical Model for Subsurface Light Transport, ACM SIGGRAPH (2001).

[#Kelemen2001]: Csaba Kelemen and Laszlo Szirmay-Kalos. A Microfacet Based Coupled Specular-Matte BRDF Model with Importance Sampling, Eurographics (2001).

[#Kettner2015]: Lutz Kettner, Matthias Raab, Daniel Seibert, Jan Jordan, Alexander Keller. The Material Definition Language, Eurographics (2015).

[#Kulla2017]: Christopher Kulla and Alejandro Conty Estevez. Revisiting Physically Based Shading at Imageworks, ACM SIGGRAPH Courses: Physically Based Shading in Theory and Practice (2017).

[#Kutz2021]: Peter Kutz, Miloš Hašan, Paul Edmondson. Novel aspects of the Adobe Standard Material, Adobe white paper (2021).

[#Lagarde2014]: Sébastien Lagarde, Charles de Rousiers. Moving Frostbite to Physically Based Rendering 3.0, ACM SIGGRAPH Courses: Physically Based Shading in Theory and Practice (2014).

[#Langlands2014]: Anders Langlands. Physically Based Shader Design in Arnold, ACM SIGGRAPH Talks (2014).

[#McDermott2018]: Wes McDermott. The PBR Guide, 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).

[#Novak2018]: Jan Novák, Iliyan Georgiev, Johannes Hanika, Wojciech Jarosz. Monte Carlo Methods for Volumetric Light Transport Simulation, Computer Graphics Forum (2018).

[#Oren1994]: Michael Oren and Shree K. Nayar. Generalization of Lambert's reflectance model, ACM SIGGRAPH (1994).

[#Pharr2023]: Matt Pharr, Wenzel Jakob and Greg Humphreys. Physically Based Rendering (4th edition) (2023).

[#Polyanskiy2023]: Mikhail N. Polyanskiy. Refractive Index Database (2023).

[#Schott2023]: SCHOTT. Interactive Abbe Diagram (2023).

[#Smythe2016]: Doug Smythe and Jonathan Stone. MaterialX: An Open Standard for Network-Based CG Object Looks

[#Turquin2019]: Emmanuel Turquin. Practical multiple scattering compensation for microfacet models., Industrial Light & Magic white paper (2019).

[#Veach1997]: Eric Veach. Robust Monte Carlo Methods for Light Transport Simulation, Ph.D. dissertation, Stanford University (1997).

[#Walter2007]: Bruce Walter, Stephen R. Marschner, Hongsong Li, and Kenneth E. Torrance. Microfacet models for refraction through rough surfaces, EGSR (2007).

[#Zeltner2018]: Tizian Zeltner and Wenzel Jakob. The Layer Laboratory: A Calculus for Additive and Subtractive Composition of Anisotropic Surface Reflectance, ACM Transactions on Graphics (2018).

[#Zeltner2022]: Tizian Zeltner, Brent Burley, and Matt Jen-Yuan Chiang. Practical Multiple-Scattering Sheen Using Linearly Transformed Cosines, ACM SIGGRAPH Talks (2022).





<style class="fallback"> body { visibility:hidden } </style> <script src="style/markdeep-1.04.min.js" charset="utf-8"> window.markdeepOptions = {tocStyle: "long", smartQuotes=true} </script> <script> window.alreadyProcessedMarkdeep || (document.body.style.visibility="visible") </script>

Footnotes

  1. The term BSDF is often specialized to BRDF or BTDF to denote the portions of the BSDF which reflect into the same hemisphere, or transmit into the opposite hemisphere, respectively.

  2. Technically, the reciprocity condition also involves the index of refraction [#Veach1997].

  3. Where $\mathrm{lerp}(a, b, t) \equiv (1 - t) a + tb$. 2 3 4

  4. Omitting Jacobian factors.

  5. Omitting normalization factors.

  6. This sum of BSDF and BSSRDF can be justified mathematically by interpreting a BSDF as the special case of a BSSRDF restricted to equal exit and entry points.