OpenPBR Surface
*Specification v1.1, 2024-06-28. *This document is a specification of a surface shading model intended as a standard for computer graphics: the OpenPBR Surface model. Designed as an über-shader, it aims to be capable of accurately modeling the vast majority of CG materials used in practical visual effects and feature animation productions. The model has been developed as a synthesis of the Autodesk Standard Surface and the Adobe Standard Material models.
![](images/OpenPBR_title.jpg align=center width="100%" attrib="Artwork by Nikie Monteleone") ![](images/ShaderPlayground_OpenPBR_meetMAT.jpg align=center width="100%" attrib="Artwork by Nikie Monteleone") ![](images/ShaderPlayground_OpenPBR_topDown.jpg align=center width="100%" attrib="Artwork by Nikie Monteleone") ![](images/ShaderPlayground_OpenPBR_scissorsMug.jpg align=center width="100%" attrib="Artwork by Nikie Monteleone")
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:
- Glossy-diffuse: dielectric with opaque internal media, e.g. wood, granite, concrete, cardboard, and wall-paint.
- Subsurface: dielectric with dense highly scattering internal media, e.g. plastic, marble, skin, vegetation, and food.
- 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.
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.
Each slab consists of a homogeneous dielectric or conducting medium
- +-----------------+ 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
Reciprocity 2 is the requirement that the BSDF is symmetric under interchange of the arguments, i.e.
If the slab is completely opaque (e.g. conducting or diffuse) we need only specify the surface BSDF
- 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
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
- +-----------------+ 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
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
Given constituent slabs, we then build a more complex composite material by "vertically" layering and "horizontally" mixing slabs, as described below.
The layer operation generates a composite material by depositing a slab
The physical act of bringing the two independent slabs
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
Note that technically, the
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
- +-----------------+ fcoat *
- | | *
- | Vcoat | *
- | | *
- +-----------------+ fsub *
- | | *
The simplest representation of this layer configuration would amount to some linear combination of the interface BSDFs
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
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.
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
-
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
-
1 - wcoat wcoat *
- +-----------------+-----------------+ *
- | | | *
- | | 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
In the case of the weighted layer operation, if the BSDF of the substrate is
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).
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
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.
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_coat_normal
,geometry_tangent
andgeometry_coat_tangent
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.
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
\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.
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
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
The Fresnel factor
The masking-shadowing function
The Normal Distribution Function (NDF)
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 due to processes like scratches or brushing. It is assumed that a reference tangent vector field is defined (via geometry_tangent
and geometry_coat_tangent
). The reference tangent vector indicates the direction along which the NDF is stretched, meaning the microscale grooves tend to be aligned with the orthogonal bitangent.
The GGX distribution in the anisotropic case is then parametrized by two separate
The NDF terms
![Figure [ndf_anisotropy]: NDF shapes as a function of roughness
To summarize the NDF parameterization, the dielectric-base BSDF
-
specular_roughness
for both$f_\mathrm{dielectric}$ and$f_\mathrm{conductor}$ , andcoat_roughness
for$f_\mathrm{coat}$ , define the roughness parameter$r$ . These roughnesses are limited to the range$[0,1]$ , since$r=1$ corresponds to a perceptually very rough surface. -
specular_roughness_anisotropy
for$f_\mathrm{dielectric}$ and$f_\mathrm{conductor}$ , andcoat_roughness_anisotropy
for$f_\mathrm{coat}$ , specify$a \in [0, 1]$ (the degree to which the NDF is stretched in the direction of the local surface tangent). The resulting NDF$\alpha_t$ ,$\alpha_b$ parameters are then determined by equation [openpbr-anisotropy-formula]. Note that the appearance of the specular highlight is identical for tangent vectors of opposite directions; this also allows the preservation of value when converting to or 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 [#Heitz2016a], 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).
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 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 | *
- | | |░░░░░░░░░░░░░░░░░░░░░░░░| | *
- +- - - - - - - - - - - - - - - - - -+ +- - - - - - - - - - - - + - - - - - - - - - - - -+ *
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
-
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
-
1 - subsurface_weight subsurface_weight *
- +-----------------------------------+ +------------------------+------------------------+ *
- |░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| |░░░░░░░░░░░░░░░░░░░░░░░░| | *
- |░░░░░░░░░░░ opaque-base ░░░░░░░░░░░| == |░░░░ glossy-diffuse ░░░░| subsurface | *
- |░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░| |░░░░░░░░░░░░░░░░░░░░░░░░| | *
- +- - - - - - - - - - - - - - - - - -+ +- - - - - - - - - - - - + - - - - - - - - - - - -+ *
Both the opaque and translucent dielectric-base share the same dielectric interface BSDF
-
The specular lobe shape is controlled by the roughness properties of the surface, parametrized by
specular_roughness
andspecular_roughness_anisotropy
(see the section on the Microfacet model NDF). -
The
specular_ior
parameter controls the index of refraction (IOR) of the dielectric. Thespecular_weight
parameter provides a convenient, texturable linear$[0, 1]$ multiplier of the dielectric reflectivity at normal incidence via reduction of the IOR below the reference value. Whenspecular_weight
is$0$ , the specular reflection disappears entirely, as the IOR of the dielectric is then equal to that of the surrounding medium. As a convenience, we also allow thespecular_weight
to exceed$1$ , thus increasing the reflectivity via increase of the IOR above the reference value. Equation [modulated_ior] below gives the formula for the applied IOR modulation. -
The
specular_color
parameter modulates the Fresnel factor of$f_\mathrm{dielectric}$ , but only for the initial reflection of light incident from above, while the light transmitted from above or below (or reflected from below) is assumed to be unaffected. This is technically unphysical if altered from the default white color (as real dielectrics have a Fresnel factor dependent only on the index of refraction), but can be useful in practice to artificially tint the specular highlight without disturbing other aspects of the light transport, i.e. the reflection due to scattering from the internal medium, or the reflection from below, or the transmission from above or below.
The formula for the specular IOR modulation controlled via specular_weight
is as follows. Given the existing specular_ior
, the ratio specular_weight
. Thus solving for the new IOR ratio
For convenience, we also allow specular_ior
. Note though there is a constraint
Specular params | Label | Type | Range | Norm | Default | Description |
---|---|---|---|---|---|---|
specular_weight |
Weight | float |
$ [0, \infty) $ | $ [0, 1] $ | $ 1 $ | Modulates the dielectric reflectivity at normal incidence |
specular_color |
Color | color3 |
$ [0, 1]^3 $ | $ (1, 1, 1) $ | Tints the dielectric Fresnel factor | |
specular_roughness |
Roughness | float |
$ [0, 1] $ | $ 0.3 $ | Roughness of NDF of dielectric BSDF |
|
specular_roughness_anisotropy |
Anisotropy | float |
$ [0, 1] $ | $ 0 $ | Anisotropy of NDF of dielectric BSDF |
|
specular_ior |
IOR | float |
$ (0, \infty) $ | $ [1, 3] $ | $ 1.5 $ | Refractive index of |
![](images/spec_ior1.png width=95%) ![](images/spec_ior2.png width=95%) ![](images/spec_ior3.png width=95%)
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 specular_roughness
and specular_roughness_anisotropy
(overloading the same parameters used for the dielectric BSDF
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 base_metalness
.
The specific model we stipulate for the metallic Fresnel factor $\mathbf{F}{\mathrm{metal}}(\mu)$ 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 specular_color
, i.e.
\begin{equation}
\mathbf{F}(\bar{\mu}) = \mathtt{specular_color} * \mathbf{F}\mathrm{Schlick}(\bar{\mu}) \ .
\end{equation}
The final metallic Fresnel term we employ is then given by an overall multiplication by specular_weight
, ensuring that entire metallic lobe is suppressed as the weight goes to zero:
\begin{equation}
\mathbf{F}{\mathrm{metal}}(\mu) = \mathtt{specular_weight} * \mathbf{F}{82}(\mu) \ .
\end{equation}
This formulation has the useful property that it reduces to the regular Schlick reflectivity at the default values of specular_weight
and 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.
Metal params | Label | Type | Range | 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, |
specular_weight |
Weight | float |
$ [0, 1] $ | $ 1 $ | Overall multiplier of the metallic Fresnel |
specular_color |
Color | color3 |
$ [0, 1]^3 $ | $ (1, 1, 1) $ | Tint color of metallic Fresnel reflection albedo at near-grazing incidence (i.e. around silhouettes) |
specular_roughness |
Roughness | float |
$ [0, 1] $ | $ 0.3 $ | Roughness of NDF of conductor BRDF |
specular_roughness_anisotropy |
Anisotropy | float |
$ [0, 1] $ | $ 0 $ | Anisotropy of NDF of conductor BRDF |
![](images/metal_with_default_edge_tint.png width=90% align=right) ![](images/metal_with_correct_edge_tint.png width=90% align=left)
The glossy-diffuse slab represents the base dielectric (parametrized as described in the Dielectric base section), embedding a semi-infinite bulk of extremely dense scattering material. The BRDF of the slab is the combination of a "glossy" specular lobe provided by immediate reflection from the dielectric interface, and a diffuse lobe provided by scattering off the embedded substrate. This models for example the reflection from shiny, totally opaque surfaces such as dense plastic, rock, and concrete.
We choose to model this concretely as a layer of dielectric "gloss" on top of an (index-matched) 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
![](images/diffuse_smooth.png width=98% align=center) ![](images/diffuse_rough.png width=98% align=center)
Unfortunately, the original model suffers from artifacts and also does not conserve energy (i.e. is too dark). We thus
opt to define the diffuse BRDF to be a popular improved version of Oren-Nayar introduced by Fujii [#Fujii2012],
augmented with a simple analytical, reciprocal energy compensation term:
\begin{eqnarray} \label{EON_brdf}
f_\mathrm{diffuse}(\omega_i, \omega_o) = f_\mathrm{ON}(\omega_i, \omega_o) + f^\mathrm{comp}\mathrm{ON}(\omega_i, \omega_o) \ .
\end{eqnarray}
This form of the Oren-Nayar model is termed "energy-preserving Oren-Nayar" or $\textbf{EON}$.
The Oren-Nayar term $f\mathrm{ON}$ is given by the [#Fujii2012] form 6
\begin{eqnarray} \label{FON_brdf}
f_\mathrm{ON}(\omega_i, \omega_o) = \frac{w_\mathrm{d} \boldsymbol{\rho}}{\pi} \Bigl( A(\sigma) + B(\sigma) \frac{s}{t}
\Bigr) \ .
\end{eqnarray}
The roughness parameter base_diffuse_roughness
. The overall weight
base_weight
.
The RGB base_color
, as described below.
The directional albedo $E_\mathrm{ON}(\omega) = w_\mathrm{d} \boldsymbol{\rho},\hat{E}\mathrm{ON}(\omega)$, and
corresponding average albedo $\langle\hat{E}\mathrm{ON}\rangle$, of the Oren-Nayar term can be determined
analytically 7. The energy compensation term $f^{\mathrm{comp}}\mathrm{ON}$ is given in terms of the
albedo $\langle\hat{E}\mathrm{ON}\rangle$ by
\begin{equation} \label{EON_comp}
f^\mathrm{comp}\mathrm{ON}(\omega_i, \omega_o) = \frac{w\mathrm{d} \boldsymbol{\rho}\mathrm{ms}}{\pi}
\bigl(1 - \hat{E}\mathrm{ON}(\omega_i)\bigr)
\bigl(1 - \hat{E}\mathrm{ON}(\omega_o)\bigr) \ ,
\end{equation}
where the factor $\boldsymbol{\rho}\mathrm{ms}$ accounts approximately for multiple scattering on the microfacet surface:
\begin{equation}
\boldsymbol{\rho}\mathrm{ms} = \frac{\boldsymbol{\rho}^2}{\pi}
\frac{\langle\hat{E}\mathrm{ON}\rangle / (1 - \langle \hat{E}\mathrm{ON}\rangle)}{1 - \boldsymbol{\rho} \bigl(1 - \langle \hat{E}\mathrm{ON}\rangle\bigr)} \ .
\end{equation}
One can verify that as
Physically there will be additional darkening and saturation of the observed color due to multiple inter-reflections
(scattering) within the gloss layer, as described in the coat darkening section. However in this case, we wish to
automatically compensate for this effect by adjusting the base_color
(in a similar spirit to the albedo
remapping described in the Subsurface section).
To define the meaning of the specified color in terms of the underlying base albedo, we write the normal-direction
reflectance of the glossy-diffuse slab (in the
We then define base_color
to be such that the reflectance of the remaining energy transmitted
into the slab, $\mathbf{E}\textrm{diffuse}$ in the Lambertian case of zero base_diffuse_roughness
(i.e. $\sigma
= 0$), is given by
\begin{eqnarray} \label{glossy_diffuse_albedo_constraint}
\mathbf{E}\textrm{diffuse} = \bigl( 1 - \mathbf{E}\textrm{spec} \bigr) \mathbf{C} \ .
\end{eqnarray}
In other words, the selected color $\mathbf{C}$ parametrizes the fraction of the energy transmitted into the dielectric layer that is subsequently transmitted back out due to reflection from a Lambertian interface. Thus since $0 \le \mathbf{C} \le 1$, $\mathbf{E}\textrm{glossy-diffuse} \le 1$ so energy is always conserved, and if
Given the required diffuse albedo $\mathbf{E}\textrm{diffuse}$ according to the formula above, then in principle, the $\boldsymbol{\rho}$ parameter of the Oren-Nayar model $f\mathrm{diffuse}(\omega_i, \omega_o)$ which generates the required $\mathbf{E}\textrm{diffuse}$ can be determined. A reasonable practical, albeit non-reciprocal, approximation to the resulting BRDF of the glossy-diffuse slab, which satisfies this requirement is obtained via the non-reciprocal albedo-scaling approximation of equation [non-reciprocal-albedo-scaling]:
\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}
In this approximation, the
If a reciprocal formulation is desired, the classic Ashikhmin-Shirley or Kelemen model ([#Ashikhmin2000], [#Kelemen2001], [#Kulla2017], [#Kutz2021]) form is
\begin{equation}
f_\textrm{glossy-diffuse}(\omega_i, \omega_o) \approx f_\mathrm{dielectric}(\omega_i, \omega_o) + \mathcal{N} \bigl(1 - E_\mathrm{dielectric}(\omega_i)\bigr) \bigl(1 - E_\mathrm{dielectric}(\omega_o)\bigr) ,f_\mathrm{diffuse}(\omega_i, \omega_o) \ ,
\end{equation}
where
Glossy-diffuse params | Label | Type | Range | Default | Description |
---|---|---|---|---|---|
base_weight |
Weight | float |
$ [0, 1] $ | $ 1 $ | Scalar multiplier of |
base_color |
Color | color3 |
$ [0, 1]^3 $ | $ (0.8, 0.8, 0.8) $ | Base reflection albedo color according to equation [glossy_diffuse_albedo_constraint]. |
base_diffuse_roughness |
Diffuse Roughness | float |
$ [0, 1] $ | $ 0 $ | Roughness of the diffuse lobe |
![](images/glossy_diffuse_diffuseonly.png width=99%) ![](images/glossy_diffuse_speconly.png width=99%) ![](images/glossy_diffuse_sum.png width=99%)
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 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
\begin{equation} S_\mathrm{subsurface} = \mathrm{Slab}(f_\mathrm{dielectric}, V^\infty_\mathrm{subsurface}) \ . \end{equation}
As in the cases of the glossy-diffuse slab and the translucent-base, the subsurface is bounded by a dielectric interface with BSDF
-
subsurface_radius
*subsurface_radius_scale
: the mean free path (MFP) per RGB channel,$\mathbf{r}$ , i.e. the average distance that a ray of light travels through the medium before being absorbed or scattered. This thus controls the apparent density of the medium. In the limit of zero MFP, the medium tends towards infinite density, and approaches the look of an opaque diffuse surface. 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 such as skin where the MFP is lower than the scene length units. Thesubsurface_radius_scale
controls the color channel dependence of the MFP, and thus this color is visible in the light transmitted through thinner regions of the subsurface volume. -
subsurface_color
: the observed RGB reflection albedo color taking into account all orders of multiple scattering,$\mathbf{C}$ (where the sense in which this parametrizes the observed color is discussed in detail below). -
subsurface_scatter_anisotropy
: the medium's phase function, parametrized by the scalar anisotropy$g \in [-1, 1]$ . In practice implementations may want to internally clamp the anisotropy as the phase function becomes ill-defined and the rendering unstable near the -1, 1 limits.
We now define in detail how these subsurface parameters collectively determine the underlying volumetric parameters (per-channel extinction
The extinction coefficient is simply given by the reciprocal of the MFP per channel:
To define the meaning of the observed subsurface_color
subsurface_color
subsurface_color
passes the furnace test. According to this definition, the subsurface_color
Given the required multiple-scattering albedo $\mathbf{E}\mathrm{multi-scatter}$ according to the formula above, then in principle, the single-scattering albedo $\boldsymbol{\alpha}$ which generates the required $\mathbf{E}\mathrm{multi-scatter}$ can be determined (assuming the given extinction $\boldsymbol{\mu}t$ and anisotropy $g$). We do not require any particular theoretical formula for $\boldsymbol{\alpha}(\mathbf{C})$ be used, but the closer it is to satisfying equation [subsurface_albedo_constraint] the closer it is to the ground truth. Ideally, this formula should take into account all the properties of the medium as well as the dielectric interface. A number of such approximate formulas have been derived in the literature. A well-known approximation is due to van de Hulst ([#Kulla2017], [#d'Eon2021]), which assumes an index-matched boundary (i.e. $\mathbf{E}\mathrm{spec} = 0$, thus subsurface_color
The phase function anisotropy subsurface_scatter_anisotropy
parameter 8. It is assumed that the phase function has the standard Henyey--Greenstein form.
Once the underlying volumetric medium properties
Note that the default value of subsurface_radius_scale
is set at
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) $ | The observed reflection color of |
|
subsurface_radius |
Radius | float |
$ [0, \infty) $ | $ [0, 1] $ | $ 1 $ | Length scale of MFP |
subsurface_radius_scale |
Radius scale | color3 |
$ [0, 1]^3 $ | $ (1.0, 0.5, 0.25) $ | RGB multiplier to subsurface_radius , giving the per-channel MFPs |
|
subsurface_scatter_anisotropy |
Anisotropy | float |
$ [-1, 1] $ | $ 0 $ | Anisotropy of the Henyey--Greenstein phase function of the interior medium |
![](images/subsurface1.jpg width=99%) ![](images/subsurface2.jpg width=99%) ![](images/subsurface3.jpg width=99%)
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
The index of refraction of specular_ior
(as for the entire dielectric-base).
The volumetric properties of transmission_color
transmission_depth
The transmission_depth
is the 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 transmission_depth
can be any value greater than or equal to zero. For convenience, we make the soft range transmission_depth
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 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
transmission_scatter_anisotropy
(the standard Henyey--Greenstein phase function is assumed 8).
![](images/transmission1.jpg width=99%) ![](images/transmission2.jpg width=99%) ![](images/transmission3.jpg width=99%)
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 specular_ior
(including any modulation via specular_weight
as in equation [modulated_ior]) defines
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 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%)
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 |
|
transmission_depth |
Depth | float |
$ [0, \infty) $ | $ [0, 1] $ | $ 0 $ | Controls the depth into the volume at which the transmission_color is realized; if zero, 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 |
|
transmission_dispersion_scale |
Dispersion scale | float |
$ [0, 1] $ | $ 0 $ | Linearly scales the amount of dispersion | |
transmission_dispersion_abbe_number |
Abbe number | float |
$ [0, \infty) $ | $ [9, 91] $ | $ 20 $ | Physical Abbe number of the base dielectric medium |
Iridescence is the occurrence of rainbow-like color fringes in the reflection when a thin dielectric film with thickness on the order of the wavelength of light is placed on top of a material, due to wave interference between the various electromagnetic reflection modes within the film. 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:
-
thin_film_weight
: the coverage (presence) weight of the film, -
thin_film_thickness
: the thickness of the film in micrometers ($\mathrm{\mu m}$ ), mostly affecting the spacing of the fringes, -
thin_film_ior
: the index of refraction (IOR) of the film, mostly affecting the hue of the fringes
The coverage weight functions as a blend between the BSDF with and without the presence of the film, and thus allows one to dial the effect without altering the shape and saturation of the color fringes.
The currently recommended thin-film model is that of Belcour and Barla [#Belcour2017]. The shape and color of the fringe patterns in the reflection from the film will be affected (as described by Belcour and Barla) by the complex IOR of the adjacent media above and below the film, which in general are a statistical mix of metal and dielectric below and coat and ambient medium above (which the fuzz is index-matched to). Figure [ior_configs] illustrates the eight possible different structures depending on the presence of both the film and coat, each of which leads to different Fresnel effects due to the differing IORs at the interfaces.
![Figure [ior_configs]: Schematic of all 8 possible IOR configurations, including those involving the thin-film.](images/IOR_configs.svg width="95%" align="center")
In principle the implementation should deal with all these physical configurations correctly, though modeling of the precise effect is implementation-dependent. In practice, this wave-optics effect is most easily incorporated directly into the Fresnel factor of the microfacet BSDFs of both the metal and dielectric-base layers. (For this reason, this effect is not represented by incorporating an explicit thin-film Slab into the model).
Note that in the case of the dielectric base, the thin-film should also generate color fringes in the transmission lobe. This is important for example when rendering soap bubbles (see [#Belcour2017]).
In the case of the metallic base the physics is somewhat ambiguous since, as described in the Metal section, the Fresnel factor for metal is defined according to the Schlick-based "F82-tint" parametrization which does not specify the underlying physical complex IOR. We suggest here that some reasonable approximation is employed to map the Fresnel factor to the best matching effective complex IOR, for example that described by [#Gulbrandsen2014].
Thin-film params | Label | Type | Range | Norm | Default | Description |
---|---|---|---|---|---|---|
thin_film_weight |
Weight | float |
$ [0, 1] $ | $ 0 $ | Coverage weight of the thin film | |
thin_film_thickness |
Thickness | float |
$ [0, \infty) $ | $ [0, 1] $ | $ 0.5 $ | Thickness of the film in micrometers ( |
thin_film_ior |
IOR | float |
$ (0, \infty) $ | $ [1, 3] $ | $ 1.4 $ | Refractive index of the film |
![](images/thin_film_0nm.png width=99%) ![](images/thin_film_300nm.png width=99%) ![](images/thin_film_600nm.png width=99%)
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 coat_roughness
and coat_roughness_anisotropy
(see the Microfacet model section). The IOR coat_ior
of this dielectric layer is distinct from that of the base dielectric, as described below. There is also assumed to be an embedded purely absorbing medium
The coat is applied on top of the base substrate, with a coverage weight 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 coat_color
, which is assumed to specify the square of the transmittance coat_color
). Thus at normal incidence, the observed tint color of the underlying base due to absorption in the coat is approximately given by coat_color
due to the absorption along the incident and outgoing rays (note that the specular reflection from the coat itself is not tinted).
The IOR
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 |
|
coat_roughness |
Roughness | float |
$ [0, 1] $ | $ 0 $ | Roughness of NDF of coat BSDF |
|
coat_roughness_anisotropy |
Anisotropy | float |
$ [0, 1] $ | $ 0 $ | Anisotropy of NDF of coat BSDF |
|
coat_ior |
IOR | float |
$ (0, \infty) $ | $ [1, 3] $ | $ 1.6 $ | Refractive index of |
coat_darkening |
Darkening | float |
$ [0, 1] $ | $ 1 $ | Modulates the physical coat darkening effect. |
![](images/coat_0.png width=90% align=right) ![](images/coat_1.png width=90% align=left)
In the full light transport, the observed color of the coated base is darkened and saturated due to multiple internal reflections from the inside of the coat, which causes light to strike the underlying material multiple times and undergo more absorption, and the observed coat_color
tint also darkens as the incidence angle changes due to the change in path length in the medium. Also, the presence of a rough coat will increase the apparent roughness of the BSDF lobes of the underlying base.
We assume that in the ground truth appearance, all these physical effects are accounted for 9. In the following sub-sections, we detail recommendations for implementation of them.
If the coat is rough, the microfacet BSDF lobes of the underlying base substrate (metal and dielectric) are also effectively roughened. If this is not otherwise accounted for by the light transport, it can instead be reasonably approximated by directly altering the NDF of the base BSDFs.
A formula we recommend for this is obtained by identifying the NDF of each microfacet lobe as corresponding approximately to a Gaussian in slope-space with variance given by coat_weight
) is given by
\begin{equation}
r'\mathrm{B} = \mathrm{lerp}\Bigl( r_\mathrm{B}, \mathrm{min} \bigl(1, r^4_\mathrm{B} + 2 r^4_\mathrm{C} \bigr)^\frac{1}{4}, \mathtt{C} \Bigr)
\end{equation}
where specular_roughness
and coat_roughness
.
Figure [coat_darkening_grid] shows the physically-correct change in appearance (at normal incidence) of a textured diffuse base with a wood texture and smooth clear-coat as the IOR of the clear-coat is varied, exhibiting darkening of the base -- due to the internal reflections in the coat -- which increases as IOR increases.
![Figure [coat_darkening_grid]: Diffuse base with a clear-coat, for coats of different relative IOR
However this darkening may not always be desirable artistically, as in some applications it is beneficial for the observed color of the coated color to "match" the input base color (in a sense defined more precisely below in equation [undarkened_coat_albedo]). We allow for this by introducing a coat_darkening
parameter,
What we mean by "counteract the darkening" is defined as the albedo of the coated base viewed at normal incidence, coat_darkening
is then defined to be the following modulation of the applied boost factor:
\begin{equation} \label{boost_factor}
B(\delta) = \mathrm{lerp}(B_0, 1, \delta) \ .
\end{equation}
While this defines the behavior at a physical level, in practice implementations will need to develop some specific approximation for the coat darkening effect.
While this can be implementation dependent, we suggest here a reasonably simple, efficient scheme which captures the essential behavior.
It can be shown that in the case of a Lambertian base with (constant) albedo
Here
We thus recommend in the general case that the darkening factor of equation [general_darkening_formula] be applied, but taking
\begin{equation} \label{internal_diffuse_reflection_coefficient_for_general_base}
K = \mathrm{lerp}(K_s, K_r, r_b)
\end{equation}
where base_metalness
specular_roughness
, according to the base dielectric Fresnel factor modulated via specular_weight
Given the general formula equation [general_darkening_formula] for the darkening, a reasonable approximate scheme -- assuming no other compensation is made to approximate the effect -- is to multiply the base BSDF by the uniform modulated darkening factor (taking into account the presence weight coat_weight
and the darkening parameter coat_darkening
):
\begin{equation} \label{modulated_darkening_factor}
(1-\mathtt{C}) + \mathtt{C} , B(\delta) ,\Delta = \mathrm{lerp}(1, \Delta, \mathtt{C},\delta) \ ,
\end{equation}
with
The base albedo
In the case of an absorbing coat, there is also enhanced darkening and saturation at grazing angles due to increased path-length within the coat medium. The effect of this can be modeled via a factor in the coat BRDF of
\begin{equation}
T_\mathrm{coat}^\mbox{$1/\mu^t_i + 1/\mu^t_o$}
\end{equation}
where coat_color
. 11
![Figure [coat_view_dependent_absorption_color]: The color of an absorbing coat becomes darker and more saturated at grazing angles.](images/coat_view_dependent_absorption_color.png width="75%")
A technical issue which can cause difficulties in the implementation of the BRDF of the coated dielectric base should also be mentioned.
See Figure [coat_base_schematic] for a schematic of a ray refracting from the ambient exterior medium (with IOR
![Figure [coat_base_schematic]: Ray configuration at coat-base boundary.](images/dielectric_tir_issue.svg width="85%")
If the coat IOR
However if the surfaces are smooth and parallel, it is easy to show that no such TIR is possible for a ray incident from the exterior due to the refraction of the ray at the upper coat-ambient boundary
We suggest as a reasonable practical approximation (following [#Kutz2021]) to simply invert the IOR ratio at the coat-base boundary, i.e. replace
An alternative approach is to explicitly modify the refraction angle cosine of the incident direction to the base. Assuming for simplicity that in the local space of the base microfacet the overlying coat microfacet has matching micronormal, the angle cosine
Both these schemes produce a plausible appearance that eliminates the spurious TIR. A more physically-correct approach would require something similar to the Weidlich-Wilkie layering model [#Weidlich2007], or the layered material model described in Physically Based Rendering [#Pharr2023], where the scattering through the layers is explicitly modeled via Monte Carlo simulation.
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 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
- The fuzz represents a homogeneous volumetric layer with a fiber-like SGGX microflake [#Heitz2015] phase function. This is approximated using a Linearly Transformed Cosines (LTC) model [#Heitz2016b] fitted to volumetric simulations. The microflake fibers are assumed to have a single-scattering albedo that effectively produces a reflection tinted with the
fuzz_color
after multiple scattering, allowing the fuzz to darken as well as lighten. - The volumetric fuzz layer is assumed to have a fixed unit optical thickness in all channels, and is purely scattering so no energy is absorbed. Thus any light not reflected after multiple scattering is assumed to transmit to the lower layers, and the transmittance is gray so the base is not tinted by the fuzz. The amount of this fixed thickness fuzz is controlled via the layer coverage weight
fuzz_weight
. The fuzz layer is also assumed to be index-matched with the adjacent slab above it, i.e. the fibers are embedded in the surrounding dielectric medium, thus there is no Fresnel reflection from the slab. - The
fuzz_roughness
parameter controls how fibre-like the microflake distribution of the layer is. At low roughness the microflakes are highly fibre-like (i.e. thin fibres oriented along the normal) producing a high-sheen fabric appearance, while at high roughness the microflakes are spherical producing a dusty appearance.
The form of this model is the following (with fuzz_color
, fuzz_roughness
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 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 geometry_coat_normal
and geometry_normal
separately (if they differ), and the final result blended according to the coat_weight
. As a practical approximation, it may be more convenient and efficient to instead approximate the fuzz normal by interpolating the coat and base normal according to coat_weight
.
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 |
fuzz_roughness |
Roughness | float |
$ [0, 1] $ | $ 0.5 $ | Reflection roughness of |
![](images/fuzz1.jpg width=99%) ![](images/fuzz2.jpg width=99%) ![](images/fuzz3.jpg width=99%)
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
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, i.e. the HDR emission in the model color space is defined to have a color given by emission_color
* emission_luminance
, thus the resulting luminance may be less than the input parameter, or even zero if the emission_color
is set to (0, 0, 0).
Moreover, the overall material luminance may be further reduced in the presence of coat or fuzz, as they can absorb light coming from the emissive layer before it exits the surface. The emission from the top surface should in principle gain a directional dependence due to the combined effects of absorption, total internal reflection (TIR) and multiple bounces in the coat layer, and absorption in the fuzz layer. The combined effect should result mostly in darkening and saturation at grazing angles.
Being an intensity, emission_luminance
can be any value greater than or equal to zero. For convenience, we make the soft range
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)
The final surface is defined as a mix of the entire
-
1 - geometry_opacity geometry_opacity *
- +-----------------------------------+ +------------------------+------------------------+ *
- | | | | | *
- | PBR | == | ambient medium | surface | *
- | | | | | *
- +- - - - - - - - - - - - - - - - - -+ +- - - - - - - - - - - - + - - - - - - - - - - - -+ *
Note that in the case of a non-thin-walled material,
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
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%)
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
and geometry_coat_tangent
may also be specified, to define the direction of the microfacet anisotropy on the base layer and coat layer, for effects such as brushed metal. Similar to normal mapping, the tangent may be transformed with a 2D vector map to alter the direction of the anisotropy.
The perturbed normals and tangents 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 or tangent 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.
The normal and tangent are assumed to be unit vectors. Reconstruction filtering techniques such as texture filtering may cause the interpolated value to not be normalized, which can be corrected with a renormalization to reduce visible artifacts caused by this filtering.
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. Thetransmission_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_scatter_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 thebase_diffuse_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)
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
Here the substrate lobes
Note that in this albedo-scaling approximation, the transmission Fresnel factor associated with specular_color
.
Since
Next, the coat is layered on top of the base substrate with the coverage weight
Similarly, the fuzz layer is applied with coverage weight
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
If
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 | pass-through (delta BTDF) | as in the Opacity / Transparency section | |
Coating | coat BRDF | as in the Coat section | |
Emission | emission EDF | as in the Emission section | |
Metal | metal BRDF | as in the Metal section | |
Specular reflection | specular BRDF | as in the Dielectric-base section | |
Specular transmission | specular BTDF/BSSRDF | as in the Translucent-base section | |
Fuzz | fuzz BRDF | as in the Fuzz section | |
Subsurface scattering | subsurface BSSRDF | as in the Subsurface section | |
Diffuse reflection | 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.
An aspect that has been ignored in this approximation (in the non-thin-walled case) is the different light transport for rays incident from the top or the bottom side. In reality the physical effect of the layers differs in these cases. For entering rays:
- The fuzz reflection is not tinted by the coat absorption.
- The coat reflection is dimmed and roughened by the fuzz.
- The dielectric reflection and transmission are both dimmed and roughened by both the coat and the fuzz.
While for rays which are exiting:
- The fuzz reflection (viewed from inside) now will be tinted by the coat absorption.
- The reflection from the coat "top" interface (with the fuzz) is not dimmed or roughened by the fuzz. This reflection is also an internal one, so has different Fresnel factor.
- Only dielectric transmission is dimmed/roughened by coat and fuzz, while the reflection is unaffected (except for being an internal reflection as well).
A more accurate implementation should in principle account for these effects.
The ground truth appearance should perfectly preserve energy in various configurations, in which case the material will satisfy a white furnace test where the object should "disappear" (i.e. merge into the background) when illuminated by uniform background light, and rendered in the limit of a large number of bounces. We list here for convenience the configurations in which such a white furnace test should pass, all of which would be useful to check as part of a unit testing framework:
- A fully metallic base (
base_metalness
=1) with whitebase_color
and whitespecular_color
. - A fully dielectric base (
base_metalness
=0), with whitespecular_color
, including:- diffuse base with white
base_color
. - subsurface (
subsurface_weight
=1) with whitesubsurface_color
. - translucent base (
transmission_weight
=1) with either:- white
transmission_color
iftransmission_depth
=0, or - white
transmission_scatter
iftransmission_depth
> 0.
- white
- diffuse base with white
- Any mix of the above.
- All of the above, with a coat (
coat_weight
> 0) and whitecoat_color
. - All of the above, with fuzz (
fuzz_weight
> 0) and whitefuzz_color
.
In all of the above cases, the white furnace test should also continue to pass regardless of:
- the presence of thin-film (via
thin_film_weight
) as the film is non-absorptive. - NDF roughness or anisotropy (
specular_roughness
,specular_roughness_anisotropy
, andcoat_roughness
,coat_roughness_anisotropy
). - volume anisotropy (
subsurface_scatter_anisotropy
,transmission_scatter_anisotropy
). - the presence of bump/normal mapped base or coat (
geometry_normal
,geometry_coat_normal
) - opacity (
geometry_opacity
).
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].
(insert parametrization.md.html here)
The core authors are Zap Andersson, Paul Edmondson, Julien Guertault, Adrien Herubel, Alan King, Peter Kutz, Andréa Machizaud, Jamie Portsmouth, Frédéric Servant and Jonathan Stone.
The authors would also like to thank François Beaune, Henrik Edstrom, Eugene d'Eon, Jerry Gamache, Iliyan Georgiev, Lee Griggs, Niklas Harrysson, Miloš Hašan, Stephen Hill, Chris Kulla, Anders Langlands, Frankie Liu, Thomas Makryniotis, André Mazzone, Nikie Monteleone, Michael Nickelsky, Anton Palmqvist, Guido Quaroni, Nathan Reed, Anthony Salvi, Lukas Stockner, Masuo Suzuki, Brecht van Lommel, Andrea Weidlich and Nicolas Wirrmann for their useful contributions.
[#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).
[#Dupuy2023]: Jonathan Dupuy, Anis Benyoub. Sampling Visible GGX Normals with Spherical Caps, High-Performance Graphics (2023).
[#Elias2001]: Mady Elias, Lionel Simonot, and Michel Menu. “Bidirectional reflectance of a diffuse background covered by a partly absorbing layer”. In: Optics Communications 191.1 (2001).
[#d'Eon2021]: Eugene d’Eon. A Hitchhiker’s guide to multiple scattering: Exact Analytic, Monte Carlo and Approximate Solutions in Transport Theory (2022).
[#Fujii2012]: Yasuhiro Fujii. A tiny improvement of Oren-Nayar reflectance model (2018).
[#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).
[#Gulbrandsen2014]: Ole Gulbrandsen. Artist Friendly Metallic Fresnel, Journal of Computer Graphics Techniques (2014).
[#Heitz2014]: 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).
[#Heitz2018]: Eric Heitz. Sampling the GGX Distribution of Visible Normals, Journal of Computer Graphics Techniques (2018).
[#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).
[#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).
[#Weidlich2007]: Andrea Weidlich and Alexander Wilkie. Arbitrarily Layered Micro-Facet Surfaces, GRAPHITE '07 (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
-
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. ↩
-
Technically, the reciprocity condition also involves the index of refraction [#Veach1997]. ↩
-
Where $\mathrm{lerp}(a, b, t) \equiv (1 - t) a + tb$. ↩ ↩2 ↩3
-
Omitting Jacobian factors. ↩
-
Omitting normalization factors. ↩
-
The $s$ term is given by (with normal $\mathbf{n}$): \begin{eqnarray*} s = \omega_i \cdot \omega_o - (\mathbf{n} \cdot \omega_i) (\mathbf{n} \cdot \omega_o) \nonumber = \cos(\phi_i-\phi_o) ,\sin\theta_i ,\sin\theta_o \end{eqnarray*} and \begin{equation} \frac{1}{t} = \begin{cases} 1 & \text{if $s \le 0$}\ 1 / \max\left(\mathbf{n} \cdot \omega_i, N \cdot \omega_o\right) & \text{if $s > 0$ .} \end{cases} \end{equation} The $A, B$ coefficients are \begin{eqnarray} A &=& \frac{1}{1 + \left(\frac{1}{2} - \frac{2}{3\pi}\right)\sigma}\ , \nonumber \ B &=& \sigma A \ . \end{eqnarray} ↩
-
The albedo of the [#Fujii2012] form of the Oren-Nayar BRDF is given by $E_\mathrm{ON}(\omega) = \rho,\hat{E}\mathrm{ON}(\omega)$, where For unit $\rho$, \begin{eqnarray} \hat{E}\mathrm{ON}(\omega) = A + \frac{B}{\pi} G(\omega) \ , \end{eqnarray} where (in spherical polars) \begin{equation} G(\theta) = \sin\theta \Bigl( \theta - \sin\theta \cos\theta \Bigr) + \frac{2}{3}\tan\theta \Bigl(1 - \sin^3\theta - \cos\theta\Bigr) \ . \end{equation} The corresponding albedo averaged over the hemisphere is given by \begin{equation} \langle\hat{E}_\mathrm{ON}\rangle = A + \left(\frac{2}{3} - \frac{28}{15\pi}\right) B \ . \end{equation} ↩
-
Technically, $g$ is the mean cosine of deflection of the phase function, which is not specific to the Henyey--Greenstein phase function model [#d'Eon2021]. ↩ ↩2
-
In reality, coats can also darken the underlying surface due to a different mechanism where the coat modifies the Fresnel factor of the base due to the coat material filling in air gaps between granules or threads of a porous base material, which reduces the relative IORs at the internal interfaces. This occurs e.g. on adding water to sand or fabric, or adding a penetrating wood finish. We assume here that this effect explicitly does not occur, at present, since we do not have enough knowledge about the properties of the underlying substance to model it. We can only safely assume that the first mechanism of darkening, i.e. internal reflections, occurs. ↩
-
The hemispherical (or average) albedo of the Fresnel factor is defined as $E_F(\eta) \equiv 2 \int_0^1 F(\mu, \eta),\mu,\mathrm{d}\mu$. This can be tabulated, or one can use the convenient analytical approximation [#d'Eon2021] (accurate to within 0.2% in the limited range $\eta \in [1,3]$): \begin{equation} E_F(\eta) \approx \ln \biggl( \frac{10893\eta - 1438.2}{-774.4\eta^2 + 10212\eta + 1} \biggr) \ . \end{equation} Values of $E_F(\eta)$ for $\eta < 1$ are related to the values for $\eta > 1$ via: \begin{equation} E_F(\eta) = 1 - \eta^2 \bigl(1 - E_F(1/\eta)\bigr) \ . \end{equation} ↩
-
Technically, the internal diffuse reflection coefficient $K$ described in the Darkening section should also be modified to account for the absorption, but the effect of this can reasonably be ignored. ↩
-
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. ↩