Why Metallic glTF Models Have Zero Diffuse Reflections
In the glTF 2.0 physically based rendering (PBR) specification, setting the metallic parameter to 1.0 eliminates diffuse reflection entirely. This article explains the physical principles separating conductors from dielectrics, outlines the mathematical formulation used in glTF shaders to enforce energy conservation, and clarifies how the base color shifts from defining diffuse albedo to determining specular reflectance.
The Physics of Conductors vs. Dielectrics
Diffuse reflection is not an instantaneous surface bounce; it is the result of subsurface scattering. In dielectric materials (non-metals such as wood, stone, plastic, and skin), light penetrates the surface, bounces among internal microscopic particles, and re-emerges at random angles as diffuse light. A small percentage of light (typically around 4%) reflects immediately off the outer boundary as specular reflection.
Conductors (metals) possess a high density of free, delocalized electrons in their conduction bands. When incident light strikes a metal surface, these free electrons immediately interact with the electromagnetic wave, either reflecting it directly at the interface or absorbing it within a few nanometers, converting it into heat. Because light cannot penetrate the volume of a metal without being absorbed, subsurface scattering cannot occur. Consequently, true metals physically lack a diffuse reflection component.
The glTF Metallic-Roughness Formulation
The glTF standard simplifies complex material physics into the
Cook-Torrance microfacet BRDF model, governed primarily by
baseColor, metallic, and
roughness. To ensure that rendering remains physically
plausible and obeys the law of conservation of energy, the shader splits
light into diffuse and specular paths based on the metallic
input.
In the standard glTF reference implementation, the diffuse color (\(c_{diff}\)) is calculated using the following relationship:
\[c_{diff} = \text{baseColor} \times (1.0 - F_0) \times (1.0 - \text{metallic})\]
Where \(F_0\) represents specular reflectance at normal incidence (fixed at 0.04 for common dielectrics).
When the metallic value reaches 1.0:
- The term \((1.0 - \text{metallic})\) evaluates to 0.0.
- The diffuse color vector drops to zero: \(c_{diff} = (0.0, 0.0, 0.0)\).
- The diffuse BRDF contribution (such as Lambertian diffuse) is multiplied by zero, wiping out all diffuse lighting.
Redefining Base Color as Specular Tint
Because metals possess no diffuse reflection, the
baseColor property changes its physical meaning as the
metallic value increases.
For dielectric surfaces (metallic = 0.0),
baseColor represents the diffuse albedo, while the specular
reflectance (\(F_0\)) remains a fixed
achromatic value of 4% (RGB: 0.04, 0.04, 0.04).
For fully metallic surfaces (metallic = 1.0), the
baseColor is mapped directly to \(F_0\). Metals exhibit high,
wavelength-dependent specular reflection, meaning their specular
reflections are tinted (such as the distinct yellow tint of gold or the
reddish hue of copper). By zeroing out the diffuse component, glTF
transfers 100% of the material's color information into the specular
reflection term.
Non-Binary Metallic Values
While real-world materials are either conductors or dielectrics at a microscopic level, glTF permits continuous scalar values between 0.0 and 1.0 for the metallic factor. Intermediate values exist solely to account for macro-level blending across a single pixel—such as fine layers of dust, rust, corrosion, or texture filtering artifacts. Even in these blended scenarios, the diffuse reflection decreases linearly toward zero as the metallic value approaches 1.0 to preserve energy conservation.