glTF Emissive Color Calculation and emissiveFactor
In glTF 2.0, the emissive color determines the light emitted by a
material independently of scene illumination. This guide explains the
exact numeric formula used to calculate linear emissive color using
emissiveFactor, how optional texture sampling interacts
with this factor, and how extensions modify the final emission
intensity.
The Core Emissive Color Formula
In the standard glTF 2.0 specification, the linear RGB emissive color
(\(C_{\text{emissive}}\)) of a surface
fragment is governed by a component-wise multiplication of the
emissiveFactor vector and the sampled emissive texture
color.
The mathematical formula is:
\[C_{\text{emissive}} = \mathbf{F}_{\text{emissive}} \odot \mathbf{T}_{\text{linear}}\]
Where:
- \(\mathbf{F}_{\text{emissive}}\) is
the
emissiveFactor, defined as a 3-element array of floating-point numbers \([R, G, B]\). Each component defaults to0.0and typically falls in the range \([0.0, 1.0]\). - \(\odot\) denotes component-wise (Hadamard) multiplication.
- \(\mathbf{T}_{\text{linear}}\) is
the linear RGB color sampled from the
emissiveTexture.
If no emissiveTexture is assigned to the material, \(\mathbf{T}_{\text{linear}}\) defaults to
\([1.0, 1.0, 1.0]\), reducing the
formula to:
\[C_{\text{emissive}} = \mathbf{F}_{\text{emissive}}\]
Color Space Conversion
glTF textures containing color information—such as
emissiveTexture—are stored in the sRGB color space. Before
applying the multiplication formula, the texture color components must
be converted from sRGB to linear RGB:
\[\mathbf{T}_{\text{linear}} = \text{toLinear}(\mathbf{T}_{\text{sRGB}})\]
The emissiveFactor, conversely, is defined directly in
linear space within the glTF JSON, so no color space transformation is
applied to it prior to multiplication.
High Dynamic Range (KHR_materials_emissive_strength)
Because the core specification defines emissiveFactor
components within the \([0.0, 1.0]\)
range, the standard glTF extension
KHR_materials_emissive_strength is used for
high-dynamic-range (HDR) emissive surfaces. When this extension is
present, the formula expands to include a scalar multiplier:
\[C_{\text{emissive}} = \mathbf{F}_{\text{emissive}} \odot \mathbf{T}_{\text{linear}} \times s_{\text{emissive}}\]
Where \(s_{\text{emissive}}\) is the
scalar emissiveStrength parameter (defaulting to
1.0).
Final Rendering Contribution
In a physically based rendering (PBR) pipeline, the calculated emissive color does not interact with surface normals, incident light vectors, or ambient occlusion. It is directly summed with the evaluated surface reflectance:
\[C_{\text{final}} = C_{\text{lit}} + C_{\text{emissive}}\]