OpenPBR Surface specification
Zap Andersson, Paul Edmondson, Julien Guertault, Adrien Herubel, Alan King, Peter Kutz, Andréa Machizaud, Jamie Portsmouth, Frédéric Servant. *Version 0.2, 2023-10-19. A joint work of Adobe and Autodesk*This document is a specification of a surface shading model: the OpenPBR Surface model. Designed as an über-surface, it aims to be capable of accurately modeling the vast majority of CG materials used in practical visual effects and feature animation productions. The model has been developed as a synthesis of the Autodesk Standard Surface and the Adobe Standard Material models.
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 ambient_ior, or if dielectric medium tracking is not done then ambient_ior can be assumed to be 1 corresponding to air or vacuum.
Given constituent slabs, we then build a more complex composite material by "vertically" layering and "horizontally" mixing slabs, as described below.
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
- +-----------------+-----------------+ *
- | | | *
- | | 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_tangentandgeometry_coat_normalmaps, 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:

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 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 perpendicular to the stretch direction due to processes like scratches or brushing. It is assumed that a reference tangent vector field is defined (via geometry_tangent), and the surface tangent vector direction is then specified as a polar angle relative to it. The tangent direction corresponds to the direction in which the highlights are elongated (equivalently, the surface grooves lie along the orthogonal bitangent). The GGX distribution in the anisotropic case is then parametrized by two separate
!!! Note: Future work
The GGX NDF is based on the Trowbridge-Reitz NDF. [#Burley2012] proposed the Generalized-Trowbridge-Reitz (GTR) NDF which has an exponent
The NDF terms
![Figure [ndf_anisotropy]: NDF shapes as a function of roughness
!!! Note: Future work
The exact conversion from roughness
To summarize the NDF parameterization, the dielectric-base BSDF
-
specular_roughnessfor both$f_\mathrm{dielectric}$ and$f_\mathrm{conductor}$ , andcoat_roughnessfor$f_\mathrm{coat}$ , define the roughness parameter$r$ . These roughnesses are given a soft-maximum at 1, since$r=1$ corresponds to a perceptually very rough surface. -
specular_anisotropyfor$f_\mathrm{dielectric}$ and$f_\mathrm{conductor}$ , andcoat_anisotropyfor$f_\mathrm{coat}$ , specify$a \in [0, 1]$ (the degree to which the specular highlight is stretched in the direction of anisotropic rotation). The resulting NDF$\alpha_t$ ,$\alpha_b$ parameters are then determined by equation [openpbr-anisotropy-formula]. -
specular_rotationfor$f_\mathrm{dielectric}$ and$f_\mathrm{conductor}$ , andcoat_rotationfor$f_\mathrm{coat}$ , specify direction of the elongation of the specular highlight. The rotation is normalized to$[0, 1]$ representing angles from 0° to 360° counterclockwise about the normal, with 0° being the original tangent vector direction. Note that the appearance of the specular highlight is identical for rotations between$[0, 0.5]$ and$[0.5, 1]$ ; this allows the preservation of value when converting to/from other models that support directional anisotropy.
The single-scattering microfacet BRDF of equation [microfacet_brdf_ss] does not conserve energy, as it neglects to account for multiple scattering between the microfacets. An implementation should ideally account for this, via one of a number of schemes, otherwise the reflection from rough metals and dielectrics is dimmer and less saturated than it should be. A fully accurate approach is described in [#Heitz2016], where the multiple bounces are explicitly modeled via Monte Carlo. Simpler approximate models are presented in [#Kulla2017] (which functions by adding compensation lobes to account for the missing energy), and [#Turquin2019] (which scales the albedo of the lobe to maintain energy preservation at the expense of reciprocity).
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 | *
- | | |░░░░░░░░░░░░░░░░░░░░░░░░| | *
- +- - - - - - - - - - - - - - - - - -+ +- - - - - - - - - - - - + - - - - - - - - - - - -+ *
Rainbow-like iridescence effects occur due to interference when a thin refractive film with thickness on the order of the light wavelength is placed on top of a material. To model this, there is assumed to be such a thin-film sitting on top of the base substrate (whether metal or dielectric), parametrized only by its thickness and the film IOR. In practice, these effects are most easily incorporated directly into the microfacet BSDFs of both the metal and dielectric-base layers. The currently recommended thin-film model is that of Belcour and Barla [#Belcour2017].
!!! Note: Future work It is currently not physically clear enough how the IOR of the surrounding media affects the thin-film interference, and how the thin-film affects the Fresnel of the adjacent slabs. Moreover, the behavior of the current parametrization is arguably unintuitive, as the effect of the thickness is not obvious. It may be useful to have a more artist-friendly dial of the "iridescence".
| Thin-film params | Label | Type | Range | Norm | Default | Description |
|---|---|---|---|---|---|---|
thin_film_thickness |
Thickness | float |
$ [0, \infty) $ | $ [0, 2000] $ | $ 0 $ | Thickness of the film in nanometers |
thin_film_ior |
IOR | float |
$ (0, \infty) $ | $ [1, 3] $ | $ 1.5 $ | Refractive index of the film |
  
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_weightandspecular_colorparameters modulate the Fresnel factor of$f_\mathrm{dielectric}$ . Note that these are technically unphysical if altered from the defaults (as real dielectrics have a Fresnel factor dependent only on the index of refraction), but can be useful in practice (for example, to simulate green or purple anti-reflective coatings on lenses). The light transmitted through the dielectric will be compensated accordingly to preserve the energy balance (thus generating a complementary color ifspecular_coloris not white). -
The specular lobe shape is controlled by the roughness properties of the surface, parametrized by
specular_roughness,specular_anisotropy, andspecular_rotation(see the section on the Microfacet model NDF). -
The
specular_iorparameter controls the index of refraction of the dielectric, which in this case only affects the Fresnel factor. Thespecular_ior_levelparameter additionally provides a convenient$[0, 1]$ control for dialing the dielectric reflectivity (at normal incidence) to zero at the minimum and double the original reflectivity at the maximum, by modulating the IOR. This is useful for texturing the specular reflectivity in a more physically correct way than via thespecular_weight(since lowspecular_weightsuppresses the entire specular lobe at all viewing angles, while lowspecular_ior_levelstill retains the Fresnel highlights at grazing angles).
The formula for the specular IOR modulation is as follows. Given the existing specular_ior, the ratio
| Specular params | Label | Type | Range | Norm | Default | Description |
|---|---|---|---|---|---|---|
specular_weight |
Weight | float |
$ [0, 1] $ | $ 1 $ | Scalar multiplier to the dielectric Fresnel factor | |
specular_color |
Color | color3 |
$ [0, 1]^3 $ | $ (1, 1, 1) $ | Tints the dielectric Fresnel factor | |
specular_roughness |
Roughness | float |
$ [0, \infty) $ | $ [0, 1] $ | $ 0.3 $ | Roughness of NDF of dielectric BSDF |
specular_anisotropy |
Anisotropy | float |
$ [0, 1] $ | $ 0 $ | Anisotropy of NDF of dielectric BSDF |
|
specular_rotation |
Rotation | float |
$ [0, 1] $ | $ 0 $ | Orientation of roughness anisotropy | |
specular_ior |
IOR | float |
$ (0, \infty) $ | $ [1, 3] $ | $ 1.5 $ | Refractive index of |
specular_ior_level |
IOR level | float |
$ [0, 1] $ | $ 0.5 $ | Modulates the dielectric reflectivity at normal incidence between zero and double the original |
  
The glossy-diffuse slab represents a dielectric with rough GGX microfacet surface BSDF (whose "specular" parameters are described in the Dielectric base section), embedding a semi-infinite bulk of extremely dense scattering material. We choose to model this concretely as a layer of dielectric "gloss" on top of an opaque slab with a diffuse BRDF: \begin{eqnarray} M_\textrm{glossy-diffuse} = \mathrm{\mathbf{layer}}(S_\mathrm{diffuse}, S_\textrm{gloss}) \end{eqnarray}
- +-------------------------------------------------+ *
- | gloss | *
- +-------------------------------------------------+ *
- | diffuse | *
- +-------------------------------------------------+ *
where base_weight multiplied by base_color, and a roughness parameter given by base_roughness.
The resulting BRDF of the glossy-diffuse slab is the combination of a "glossy" specular lobe provided by reflection from the dielectric interface, and a diffuse lobe provided by bounces off the substrate. This models for example the reflection from shiny, totally opaque surfaces such as dense plastic, rock, and concrete. This form of BRDF model is classic in computer graphics and typically termed the Ashikhmin-Shirley or Kelemen model ([#Ashikhmin2000], [#Kelemen2001], [#Kulla2017], [#Kutz2021]).
A reasonable practical albeit non-reciprocal approximation to the resulting BRDF of the glossy-diffuse slab is \begin{equation} f_\textrm{glossy-diffuse}(\omega_i, \omega_o) \approx f_\mathrm{dielectric}(\omega_i, \omega_o) + \bigl(1 - E_\mathrm{dielectric}(\omega_o)\bigr) ,f_\mathrm{diffuse}(\omega_i, \omega_o) \ , \end{equation} obtained via the non-reciprocal albedo-scaling approximation of equation [non-reciprocal-albedo-scaling].
| Glossy-diffuse params | Label | Type | Range | Norm | Default | Description |
|---|---|---|---|---|---|---|
base_weight |
Weight | float |
$ [0, 1] $ | $ 1 $ | Scalar multiplier to base_color
|
|
base_color |
Color | color3 |
$ [0, 1]^3 $ | $ (0.8, 0.8, 0.8) $ | Reflection albedo color of |
|
base_roughness |
Roughness | float |
$ [0, \infty) $ | $ [0, 1] $ | $ 0 $ | Roughness of the diffuse lobe |
  
The subsurface slab represents a dielectric embedding a dense scattering volumetric medium, which generates significant light bleeding effects due to light propagation and diffusion under the surface, where in general the exiting ray leaves at a different surface location than the incident ray. Physically, as for the slabs defined in the Glossy-diffuse section and Translucent base section, this is a dielectric substrate with surface BSDF
\begin{equation} S_\mathrm{subsurface} = \mathrm{Slab}(f_\mathrm{dielectric}, V^\infty_\mathrm{subsurface}) \ . \end{equation}
As for the glossy-diffuse slab and the translucent-base, the subsurface is bounded by a dielectric interface with BSDF
Superimposed on this is the reflection generated by scattering in the subsurface medium. In this case the subsurface medium
-
subsurface_radius*subsurface_radius_scale: the desired size of the "blur" on the surface per RGB channel, i.e. roughly the average distance that light travels along the surface per-channel,$\mathbf{r}$ , also termed the diffusion radius. Being a length,subsurface_radiuscan be any value greater than or equal to zero. For convenience, we make the soft range$[0, 1]$ , thus covering common cases. -
subsurface_color: the observed RGB reflection albedo color taking into account all orders of multiple scattering,$\mathbf{A}$ , also termed the multi-scatter albedo. -
subsurface_anisotropy: the medium's phase function (assumed to be the standard Henyey-Greenstein form), parametrized by the scalar anisotropy$g \in [-1, 1]$ .
To minimize the entanglement and side effects of these parameters, they should each affect only the corresponding aspect of the subsurface scattering, e.g. the color should not affect the size of the blur and the anisotropy should not affect the size of the blur or the color. We stipulate here a mapping which achieves these requirements and reproduces the specified RGB diffusion profile size (width on the surface)
[#Burley2018] derived (via fitting Monte Carlo simulations) an approximate relationship between the specified surface diffusion profile width
This relationship was derived (via fitting) in the isotropic
Implementations may choose to compute light transport in the subsurface medium either via a fast, approximate bidirectional scattering surface reflectance distribution (BSSRDF) model using e.g. the dipole approximation [#Jensen2001], or more accurately via volumetric path tracing ([#Novak2018], [#Pharr2023]).
Note that the default value of subsurface_radius_scale is set at
!!! Note: Future work
The particular equations for
Since the scattered ray will in emerge from a different point on the surface than the input point, the material will in general differ there. Thus on transmitting back out, it will encounter different layer properties. In principle this should be taken into account, but how to model subsurface scattering in the presence of varying subsurface properties is an open question.
| Subsurface params | Label | Type | Range | Norm | Default | Description |
|---|---|---|---|---|---|---|
subsurface_weight |
Weight | float |
$ [0, 1] $ | $ 0 $ | Mix weight between subsurface and diffuse slabs | |
subsurface_color |
Color | color3 |
$ [0, 1] $ | $ (0.8, 0.8, 0.8) $ | Subsurface color, i.e. the multi-scatter albedo of |
|
subsurface_radius |
Radius | float |
$ [0, \infty) $ | $ [0, 1] $ | $ 1 $ | Length scale of diffusion along the surface |
subsurface_radius_scale |
Radius scale | vector3 |
$ [0, 1]^3 $ | $ (1.0, 0.5, 0.25) $ | RGB multiplier to subsurface_radius, giving the per-channel diffusion length |
|
subsurface_anisotropy |
Anisotropy | float |
$ [-1, 1] $ | $ 0 $ | Anisotropy of the Henyey-Greenstein phase function of the interior medium |
  
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 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).
!!! Note: Future work The Henyey-Greenstein phase function is not ideal for representing media with both forward and back scattering lobes (as in the Mie phase function). A richer model such as [#Jendersie2023] could be considered in a future version.
  
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_ior_level 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
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.
    
| 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 $ | Distance traveled inside the medium by white light before its color becomes exactly transmission_color by Beer's law, determining the extinction coefficient of the interior medium; if zero, transmission_color acts as a constant (on-surface) transmission tint |
transmission_scatter |
Scatter | color3 |
$ [0, 1]^3 $ | $ (0, 0, 0) $ | Scattering coefficient of the interior medium | |
transmission_scatter_anisotropy |
Anisotropy | float |
$ [-1, 1] $ | $ 0 $ | Anisotropy of the Henyey-Greenstein phase function of the interior medium |
|
transmission_dispersion_abbe_number |
Abbe number | float |
$ [0, \infty) $ | $ [9, 91] $ | $ 20 $ | Abbe number of the medium, inversely proportional to how much the index of refraction varies across wavelengths when transmission_dispersion_scale is 1; defaults to approximately the highest Abbe number of any real clear dielectric so that any realistic amount of dispersion can be achieved by varying transmission_dispersion_scale in |
transmission_dispersion_scale |
Dispersion scale | float |
$ [0, 1] $ | $ 0 $ | Linearly scales the amount of dispersion by setting the final Abbe number for rendering to transmission_abbe_number divided by transmission_dispersion_scale
|
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, specular_anisotropy, and specular_rotation (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
The specific model we stipulate for the metallic Fresnel effect is the "F82-tint" model of [#Kutz2021], which extends previous work by [#Hoffman2019].
This is based on the standard Schlick approximation to the metallic Fresnel factor (where $\mathbf{F}0$ is the RGB reflectivity at normal incidence i.e. base_weight * base_color, and $\mu$ is the cosine of the incident angle):
\begin{equation}
\mathbf{F}{\mathrm{Schlick}}(\mu) = \mathbf{F}0 + (1 - \mathbf{F}0) (1 - \mu)^5 \ .
\end{equation}
To better approximate the actual Fresnel curve of metals, in the F82-tint model the Schlick approximation is augmented with a correction term:
\begin{equation}
\mathbf{F}{82}(\mu) = \mathbf{F}{\mathrm{Schlick}}(\mu) - \frac{\mu (1 - \mu)^6}{\bar{\mu}(1 - \bar{\mu})^6} \Bigl(\mathbf{F}{\mathrm{Schlick}}(\bar{\mu}) - \mathbf{F}(\bar{\mu})\Bigr) \ .
\end{equation}
where $\bar{\mu} = 1/7$, and $\mathbf{F}(\bar{\mu})$ is the desired metallic reflectivity at that "grazing edge" angle cosine corresponding roughly to $82^\circ$ (i.e. around silhouettes), ensuring $\mathbf{F}{82}(\bar{\mu}) = \mathbf{F}(\bar{\mu})$. This desired edge reflectivity is user-specified as a fractional tint of the Schlick curve, i.e.
\begin{equation}
\mathbf{F}(\bar{\mu}) = \mathtt{specular_weight} * \mathtt{specular_color} * \mathbf{F}_\mathrm{Schlick}(\bar{\mu}) \ .
\end{equation}
This formulation has the useful property that it reduces to the regular Schlick reflectivity at the default values of
!!! Note: Future work The metallic Fresnel should ideally take into account the effective coat IOR given by equation [effective_coat_ior], as the dielectric BSDF does. But the current models don't allow for a varying IOR of the surrounding medium unfortunately. It is also not clear if taking it into account would cause a significant visual difference.
| Metal params | Label | Type | Range | Norm | Default | Description |
|---|---|---|---|---|---|---|
base_weight |
Weight | float |
$ [0, 1] $ | $ 1 $ | Scalar multiplier to base_color
|
|
base_color |
Color | color3 |
$ [0, 1]^3 $ | $ (0.8, 0.8, 0.8) $ | Color of Fresnel reflection albedo at normal incidence, |
|
specular_weight |
Weight | float |
$ [0, 1] $ | $ 1 $ | Scalar multiplier to specular_color
|
|
specular_color |
Color | color3 |
$ [0, 1]^3 $ | $ (1, 1, 1) $ | Tint color of Fresnel reflection albedo at near-grazing incidence (i.e. around silhouettes) | |
specular_roughness |
Roughness | float |
$ [0, \infty) $ | $ [0, 1] $ | $ 0.3 $ | Roughness of NDF of conductor BRDF |
specular_anisotropy |
Anisotropy | float |
$ [0, 1] $ | $ 0 $ | Anisotropy of NDF of conductor BRDF |
|
specular_rotation |
Rotation | float |
$ [0, 1] $ | $ 0 $ | Orientation of roughness anisotropy |
 
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, coat_anisotropy, and coat_rotation (see the Microfacet model section). The IOR coat_ior of this dielectric layer is distinct from that of the base dielectric, as described below (modulated by coat_ior_level in a similar fashion to specular_ior_level described in the Dielectric base section). There is also assumed to be an embedded purely absorbing medium
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 of the coat at normal incidence. Thus at normal incidence, the observed tint color of the underlying base due to absorption in the coat is approximately given by coat_color due to the absorption along the incident and outgoing rays (note that the specular reflection from the coat itself is not tinted).
In the full light transport this observed color is further darkened and saturated due to multiple internal reflections from the inside of the coat, including a considerable amount of total internal reflection, which causes light to strike the underlying material multiple times and undergo more absorption. Also the observed tint color should vary away from coat_color as the incidence angle changes, due to the change in path length in the medium. The presence of a rough coat will increase the apparent roughness of the BSDF lobes of the underlying base. We generally assume that in the ground truth appearance, all these effects are accounted for.
In reality, coats can darken the underlying surface also due to a different mechanism where the coat modifies the Fresnel factor of the base due to filling in air gaps between granules or threads, which reduces the relative IORs at the internal interfaces. This occurs e.g. on adding water to sand or fabric, or adding a penetrating wood finish. We assume here that this effect explicitly does not occur, since we do not have enough knowledge about the properties of the underlying substance to model it. We can only safely assume that the first mechanism of darkening (i.e. internal reflections) occurs.
We leave it up to the implementation to decide what level of approximation to use for this (in the simplest approximation, the coat_color can just be multiplied into the substrate lobes).
The IOR of the coat medium coat_ior parameter, will alter the Fresnel factor of both the coat top interface and the underlying metal or dielectric. The coat_ior_level parameter in specular_ior_level in equation [modulated_ior]. In detail, the coat Fresnel reflection factor at normal incidence is given by
\begin{equation}
F_c = \frac{|\eta_c - 1|^2}{(\eta_c + 1)^2} \ .
\end{equation}
where
If there is a fractional
The ratio between the specular 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, \infty) $ | $ [0, 1] $ | $ 0 $ | Roughness of NDF of coat BSDF |
coat_anisotropy |
Anisotropy | float |
$ [0, 1] $ | $ 0 $ | Anisotropy of NDF of coat BSDF |
|
coat_rotation |
Rotation | float |
$ [0, 1] $ | $ 0 $ | Orientation of roughness anisotropy | |
coat_ior |
IOR | float |
$ (0, \infty) $ | $ [1, 3] $ | $ 1.6 $ | Refractive index of |
coat_ior_level |
IOR level | float |
$ [0, 1] $ | $ 0.5 $ | Modulates the coat reflectivity at normal incidence between zero and double the original |
 
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_colorafter multiple scattering. - The volumetric fuzz layer is assumed to have a fixed unit optical thickness in all channels, and is purely scattering so no energy is absorbed. Thus any light not reflected after multiple scattering is assumed to transmit to the lower layers, and the transmittance is gray so the base is not tinted by the fuzz. The amount of this fixed thickness fuzz is controlled via the layer coverage weight
fuzz_weight. The fuzz layer is also assumed to be index-matched with the adjacent slab above it, i.e. the fibers are embedded in the surrounding dielectric medium, thus there is no Fresnel reflection from the slab. - The
fuzz_roughnessparameter 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 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 |
  
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, thus the resulting luminance may be less than the input parameter, or even zero if the color multiplier is set to (0, 0, 0).
Moreover, the overall material luminance may be further reduced in the presence of coat or fuzz, as they can absorb light coming from the emissive layer before it exits the surface. The emission from the top surface should in principle gain a directional dependence due to the combined effects of absorption, total internal reflection (TIR) and multiple bounces in the coat layer, and absorption in the fuzz layer. The combined effect should result mostly in darkening and saturation at grazing angles.
Being an intensity, emission_luminance can be any value greater than or equal to zero. For convenience, we make the soft range
!!! Note: Future work There is an ongoing discussion in the MaterialX and USD working groups regarding the description of lights and emissive objects. This part of the specification may be subject to change if it doesn't align with those standards. Moreover, a richer emission model such as the one described in the MaterialX specification could be considered in a future version of OpenPBR, but would require a more detailed description of the EDF.
In addition, the transmittance of the EDF through the coat and fuzz is currently underspecified.
| Emission params | Label | Type | Range | Norm | Default | Description |
|---|---|---|---|---|---|---|
emission_luminance |
Luminance | float |
$ [0, \infty) $ | $ [0, 1000] $ | $ 0 $ | Emission luminance, in cd/m^2 (aka. nits) |
emission_color |
Color | color3 |
$ [0, 1]^3 $ | $ (1, 1, 1) $ | Emission color multiplier |
 
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 |
  
The geometry of the surface is assumed to be given externally to the model, defining a local unperturbed shading normal and tangent space frame.
However we allow for normal mapping, which (optionally) alters this unperturbed shading frame, as a part of the material model, as this alters the light transport and appearance fundamentally.
There are assumed to be separate normal inputs geometry_normal, geometry_coat_normal defining the perturbation of the shading normal for the base and coat BSDF models. Separately perturbing the coat normal allows for the appearance of a finite thickness coat on top of the base.
The geometry_tangent may also be specified, which controls the direction of microfacet anisotropy, for effects such as brushed metal. The base and coat are assumed to share the tangent, which is orthonormalized accordingly.
The perturbed normals and tangent will of course be specified by input textures (or possibly procedurally). As noted in the Metadata section, the particular parametrization which maps the contents of the texture to the perturbation of the normal in the shading frame is not defined in the model itself, as this can be done in multiple ways. It is instead just assumed that the material is packaged with metadata that makes this mapping unambiguous.
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_opacitymakes 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_colorcan be assumed to give the transmittance through the thin sheet at normal incidence (due to absorption). In the smooth case the BRDF and BTDF of this sheet can be solved exactly by summing over a geometrical series of terms containing Fresnel and absorption factors, and this can be extended to a good approximation of the rough case by appropriately roughening the transmission lobe (as described in [#Kulla2017]). This model of thin-walled glass is a cheaper, much more convenient way to render windows than a finite thickness non-thin-walled mesh. -
The
$\textrm{subsurface}$ slab is considered to degenerate into an infinitesimally thin sheet of dense scattering material (bounded by dielectric interfaces$f_\mathrm{dielectric}$ ), which scatters a fraction$S = \texttt{subsurface_color}$ of the incident light, split between a diffuse reflection lobe$f^R_\mathrm{diffuse}$ and diffuse transmission lobe$f^T_\mathrm{diffuse}$ according to$g = \texttt{subsurface_anisotropy} \in [-1, 1]$ . That is, where$f_+$ ,$f_-$ are albedo 1 diffuse lobes in the positive and negative hemisphere respectively: \begin{eqnarray} f^R_\mathrm{diffuse} &=& \frac{1}{2} S (1 - g), f_+ \ , \nonumber \ f^T_\mathrm{diffuse} &=& \frac{1}{2} S (1 + g), f_- \ . \label{thin_wall_subsurface} \end{eqnarray} This form ensures total energy conservation, i.e. the sum of the reflection and transmission albedos is less than 1: \begin{equation} E_R[f^R_\mathrm{diffuse}] + E_T[f^T_\mathrm{diffuse}] = S \le 1 \ . \end{equation} At the default of zero anisotropy ($g=0$ ) the energy is balanced equally between diffuse reflection and transmission. The diffuse transmission lobe shape (in both hemispheres) is assumed to be controlled by thebase_roughnessparameter. 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]).
 
!!! Note: Future work It is an open question as to what the best default interpretation of the thin-walled structure is, and what other structures we might need to specify to cover the common use cases.
!!! Note: Future work The thin-walled limit of the subsurface slab has been introduced as a convenient, slightly more physically based model than the diffuse-transmission of the Autodesk Standard Surface. It does not really correspond to the thin-walled limit of a volumetric medium (bounded by dielectrics) though. The thin-walled limit of the translucent slab described above is closer to that, though it explicitly ignores scattering. It might be worth attempting to unify these two representations into a single thin-wall dielectric volume model.
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_weight and 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.
We provide a reference implementation in MaterialX, which is based on the derivation in the previous section and the implementation of Autodesk Standard Surface [#Georgiev2019].
!!! Note: Future work Our MaterialX implementation is as faithful to the OpenPBR specification as existing shading languages (e.g. OSL, MDL) support. Thus it is still missing certain features, i.e.: - the microfacet NDF anisotropy formula of the Microfacet model section - the F82-tint conductor Fresnel model of the Metal section - the remapping logic described in the Subsurface section - the volumetric medium of the Translucent base section - the dispersion scaling logic of the Translucent base section - the thin-walled glass model of the Thin-walled case section - the specific fuzz model (of [#Zeltner2022]) specified in the Fuzz section - correct normal map blending for the Fuzz model Additional improvements to achieve this functionality will require in some cases industry-wide adoption of these features, not merely new MaterialX features.
(insert parametrization.md.html here)
In this document we have given a specification of a standard, generic surface shader for use in a wide variety of production rendering contexts. We described in detail the structure of the material in terms of physical slabs composed together via layering and mixing operations, controlled by a suite of well-defined and artist-friendly parameters.
We hope this proposal serves as a useful basis for an industry standard surface shader implementation and asset exchange format.
The authors would like to thank François Beaune, Henrik Edstrom, Iliyan Georgiev, Lee Griggs, Niklas Harrysson, Miloš Hašan, Anders Langlands, Nikie Monteleone, Michael Nickelsky, Guido Quaroni, Nathan Reed, Anthony Salvi, Lukas Stockner, Jonathan Stone and Brecht van Lommel for their contribution.
[#Andersson2016]: Zap Andersson. Physical Material, Autodesk white paper (2016).
[#Ashikhmin2000]: Michael Ashikhmin, Simon Premože, and Peter Shirley. A Microfacet-based BRDF Generator, ACM Transactions on Graphics (2000).
[#Belcour2017]: Laurent Belcour and Pascal Barla. A Practical Extension to Microfacet Theory for the Modeling of Varying Iridescence, ACM Transactions on Graphics (2017).
[#Belcour2018]: Laurent Belcour. Efficient Rendering of Layered Materials using an Atomic Decomposition with Statistical Operators, ACM Transactions on Graphics (2018).
[#Budge2002]: Brian Budge. Simple Nested Dielectrics in Ray Traced Images, Journal of Graphics Tools (2002).
[#Burley2012]: Brent Burley. Physically Based Shading at Disney, ACM SIGGRAPH Courses: Practical Physically Based Shading in Film and Game Production (2012).
[#Burley2018]: Brent Burley, David Adler, Matt Jen-Yuan Chiang, Hank Driskill, Ralf Habel, Patrick Kelly, Peter Kutz, Yining Karl Li, Daniel Teece. The Design and Evolution of Disney’s Hyperion Renderer, ACM TOG (2018).
[#Conty2017]: Alejandro Conty Estevez and Christopher Kulla Production Friendly Microfacet Sheen BRDF, Sony Pictures Imageworks technical report (2017).
[#d'Eon2021]: Eugene d’Eon. A Hitchhiker’s guide to multiple scattering: Exact Analytic, Monte Carlo and Approximate Solutions in Transport Theory (2022).
[#d'Eon2023]: Eugene d’Eon. Student-T and Beyond: Practical Tools for Multiple-Scattering BSDFs with General NDFs, ACM SIGGRAPH Talks (2023).
[#Georgiev2019]: Iliyan Georgiev, Jamie Portsmouth, Zap Andersson, Adrien Herubel, Alan King, Shinji Ogaki, and Frederic Servant. Autodesk Standard Surface, Autodesk white paper (2019).
[#Gritz2010]: Larry Gritz, Clifford Stein, Chris Kulla, and Alejandro Conty. Open Shading Language, ACM SIGGRAPH Talks (2010).
[#Heitz2014a]: Eric Heitz, Eugene d’Eon. Importance Sampling Microfacet-Based BSDFs using the Distribution of Visible Normals, Computer Graphics Forum (2014).
[#Heitz2014b]: Eric Heitz. Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs, Journal of Computer Graphics Techniques (2014).
[#Heitz2015]: Eric Heitz, Jonathan Dupuy, Cyril Crassin, Carsten Dachsbacher. The SGGX microflake distribution, ACM Transactions on Graphics (2015).
[#Heitz2016a]: Eric Heitz, Johannes Hanika, Eugene d’Eon and Carsten Dachsbacher. Multiple-Scattering Microfacet BSDFs with the Smith Model, ACM Transactions on Graphics (2016).
[#Heitz2016b]: Eric Heitz, Jonathan Dupuy, Stephen Hill and David Neubelt. Real-Time Polygonal-Light Shading with Linearly Transformed Cosines, ACM SIGGRAPH (2016).
[#Hery2017]: Christophe Hery, Ryusuke Villemin, Junyi Ling. Pixar's Foundation for Materials, Pixar technical report (2017).
[#Hoffman2019]: Naty Hoffman. Fresnel Equations Considered Harmful, EGSR (2019).
[#Jakob2014]: Wenzel Jakob, Eugene d'Eon, Otto Jakob, and Steve Marschner. A Comprehensive Framework for Rendering Layered Materials, ACM Transactions on Graphics (2014).
[#Jendersie2023]: Johannes Jendersie and Eugene d'Eon. An Approximate Mie Scattering Function for Fog and Cloud Rendering, ACM SIGGRAPH (2023).
[#Jensen2001]: Henrik Wann Jensen, Stephen R. Marschner, Marc Levoy, and Pat Hanrahan. A Practical Model for Subsurface Light Transport, ACM SIGGRAPH (2001).
[#Kelemen2001]: Csaba Kelemen and Laszlo Szirmay-Kalos. A Microfacet Based Coupled Specular-Matte BRDF Model with Importance Sampling, Eurographics (2001).
[#Kettner2015]: Lutz Kettner, Matthias Raab, Daniel Seibert, Jan Jordan, Alexander Keller. The Material Definition Language, Eurographics (2015).
[#Kulla2017]: Christopher Kulla and Alejandro Conty Estevez. Revisiting Physically Based Shading at Imageworks, ACM SIGGRAPH Courses: Physically Based Shading in Theory and Practice (2017).
[#Kutz2021]: Peter Kutz, Miloš Hašan, Paul Edmondson. Novel aspects of the Adobe Standard Material, Adobe white paper (2021).
[#Lagarde2014]: Sébastien Lagarde, Charles de Rousiers. Moving Frostbite to Physically Based Rendering 3.0, ACM SIGGRAPH Courses: Physically Based Shading in Theory and Practice (2014).
[#Langlands2014]: Anders Langlands. Physically Based Shader Design in Arnold, ACM SIGGRAPH Talks (2014).
[#McDermott2018]: Wes McDermott. The PBR Guide, Allegorithmic white paper (2018).
[#Neubelt13]: David Neubelt, Matt Pettineo. Crafting a Next-Gen Material Pipeline for The Order: 1886, ACM SIGGRAPH Courses: Physically Based Shading in Theory and Practice (2013).
[#Novak2018]: Jan Novák, Iliyan Georgiev, Johannes Hanika, Wojciech Jarosz. Monte Carlo Methods for Volumetric Light Transport Simulation, Computer Graphics Forum (2018).
[#Oren1994]: Michael Oren and Shree K. Nayar. Generalization of Lambert's reflectance model, ACM SIGGRAPH (1994).
[#Pharr2023]: Matt Pharr, Wenzel Jakob and Greg Humphreys. Physically Based Rendering (4th edition) (2023).
[#Polyanskiy2023]: Mikhail N. Polyanskiy. Refractive Index Database (2023).
[#Schott2023]: SCHOTT. Interactive Abbe Diagram (2023).
[#Smythe2016]: Doug Smythe and Jonathan Stone. MaterialX: An Open Standard for Network-Based CG Object Looks
[#Turquin2019]: Emmanuel Turquin. Practical multiple scattering compensation for microfacet models., Industrial Light & Magic white paper (2019).
[#Veach1997]: Eric Veach. Robust Monte Carlo Methods for Light Transport Simulation, Ph.D. dissertation, Stanford University (1997).
[#Walter2007]: Bruce Walter, Stephen R. Marschner, Hongsong Li, and Kenneth E. Torrance. Microfacet models for refraction through rough surfaces, EGSR (2007).
[#Zeltner2018]: Tizian Zeltner and Wenzel Jakob. The Layer Laboratory: A Calculus for Additive and Subtractive Composition of Anisotropic Surface Reflectance, ACM Transactions on Graphics (2018).
[#Zeltner2022]: Tizian Zeltner, Brent Burley, and Matt Jen-Yuan Chiang. Practical Multiple-Scattering Sheen Using Linearly Transformed Cosines, ACM SIGGRAPH Talks (2022).
<style class="fallback"> body { visibility:hidden } </style> <script src="style/markdeep-1.04.min.js" charset="utf-8"> window.markdeepOptions = {tocStyle: "long", smartQuotes=true} </script> <script> window.alreadyProcessedMarkdeep || (document.body.style.visibility="visible") </script>
Footnotes
-
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 ↩4
-
Omitting Jacobian factors. ↩
-
Omitting normalization factors. ↩
-
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. ↩