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 to 0.0 and 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}}\]