KHR\materials\diffuse_transmission

October 13, 2025 · View on GitHub

Contributors

Copyright 2025 The Khronos Group Inc. All Rights Reserved. glTF is a trademark of The Khronos Group Inc. See Appendix for full Khronos Copyright Statement.

Status

Release Candidate

Dependencies

Written against the glTF 2.0 spec.

Exclusions

  • This extension must not be used on a material that also uses KHR_materials_pbrSpecularGlossiness.
  • This extension must not be used on a material that also uses KHR_materials_unlit.

Overview

This extension models the physical phenomenon of light being diffusely transmitted through an infinitely thin material. Thin dielectric objects like leaves or paper diffusely transmit light due to dense volumetric scattering within the object. In 3D graphics, it is common to approximate thin volumetric objects as non-volumetric surfaces. The KHR_materials_diffuse_transmission extension models the diffuse transmission of light through such infinitely thin surfaces. For optically thick media (volumes) with short scattering distances and dense scattering behavior, i.e. candles, KHR_materials_diffuse_transmission provides a phenomenologically plausible and cost-effective approximation.

(Left: Diffuse Transmission Plant by Eric Chadwick CC-BY 4.0 and Rico Cilliers CC0 1.0, showing a small firefly emitting light that transmits diffusely through the back of a leaf.)

(Right: Candle model by lucatorcigliani with modifications by @emackey, showing diffuse transmission through the surface of wax paired with volumetric attenuation of light within the wax. Original source CC-BY 4.0)

Extending Materials

The effect is activated by adding the KHR_materials_diffuse_transmission extension to any glTF material.

{
  "materials": [
    {
      "extensions": {
        "KHR_materials_diffuse_transmission": {
          "diffuseTransmissionFactor": 0.25,
          "diffuseTransmissionTexture": {
            "index": 0
          },
          "diffuseTransmissionColorFactor": [
            1.0,
            0.9,
            0.85
          ]
        }
      }
    }
  ]
}

Properties

TypeDescriptionRequired
diffuseTransmissionFactornumberThe percentage of non-specularly reflected light that is diffusely transmitted through the surface.No, default: 0
diffuseTransmissionTexturetextureInfoA texture that defines the percentage of non-specularly reflected light that is diffusely transmitted through the surface. Stored in the alpha (A) channel. Will be multiplied by the diffuseTransmissionFactor value.No
diffuseTransmissionColorFactornumber[3]The color that modulates the transmitted light.No, default: [1, 1, 1]
diffuseTransmissionColorTexturetextureInfoA texture that defines the color that modulates the diffusely transmitted light, stored in the RGB channels and encoded in sRGB. This texture will be multiplied by the diffuseTransmissionColorFactor value.No

Diffuse Transmission

The proportion of light that is diffusely transmitted through a surface, rather than being diffusely re-emitted. This is expressed as a percentage of the light that penetrates the surface (i.e., not specularly reflected), rather than a percentage of the total light incident on the surface. A value of 1.0 indicates that 100% of the light that penetrates the surface is transmitted through it.

0.0 0.25 0.5 0.75 1.0
Backlit, occluded plane with blue baseColorFactor for varying diffuseTransmissionFactor.

When textured, this parameter is sampled from the A channel of the diffuseTransmissionTexture. The value is linear and is multiplied by the diffuseTransmissionFactor to determine the total diffuse transmission value.

diffuseTransmission = diffuseTransmissionFactor * diffuseTransmissionTexture.a
Backlit, occluded plane with blue baseColorFactor and a striped diffuseTransmissionTexture.
(Input texture shown in the top-left).

Diffuse Transmission Color

The proportion of light at each color channel that is not attenuated by the surface transmission. Attenuation is usually defined as an amount of light at each frequency that is reduced over a given distance through a medium by absorption and scattering interactions. However, since this extension deals exclusively with infinitely thin surfaces, attenuation is constant and equal to 1.0 - diffuseTransmissionColor.

0.0 0.25 0.5 0.75 1.0
Backlit, occluded plane with blue baseColorFactor and red diffuseTransmissionColorFactor for varying diffuseTransmissionFactor.

When textured, the RGB channels of the diffuseTransmissionColorTexture, encoded in sRGB, define the proportion of light at each color channel that is not attenuated by the surface transmission. The values are multiplied by the diffuseTransmissionFactor to determine the final diffuse transmission color.

diffuseTransmissionColor = diffuseTransmissionColorFactor * diffuseTransmissionColorTexture.rgb
0.0 0.25 0.5 0.75 1.0
Single-sided plane in a symmetric light setup. baseColorTexture and diffuseTransmissionColorTexture use textures that represent the different sides of the one-dollar bill. Series shows the setup at varying values of diffuseTransmissionFactor.

(dollar bill texture from ResourceBoy.com )

Material Structure Updates

This section is normative.

This extension changes the dielectric_brdf defined in Appendix B

dielectric_brdf =
  fresnel_mix(
    ior = 1.5,
    base = diffuse_brdf(color = baseColor),
    layer = specular_brdf(α = roughness ^ 2)
  )

to the following:

dielectric_brdf =
  fresnel_mix(
    ior = 1.5,
    base = mix(
      diffuse_brdf(color = baseColor),
      diffuse_btdf(color = diffuseTransmissionColor),
      diffuseTransmission),
    layer = specular_brdf(α = roughness ^ 2)
  )

Increasing the strength of the diffuse transmission effect using the diffuseTransmission parameter takes away energy from the diffuse reflection BSDF and passes it to the diffuse transmission BSDF. The specular reflection BSDF and Fresnel weighting are not affected.

Implementation

This section is non-normative.

With a simple Lambert BRDF model, diffuse_brdf and diffuse_btdf may be implemented as follows

function diffuse_brdf(color) {
  if (view and light on same hemisphere) {
    return (1/pi) * color
  } else {
    return 0
  }
}

function diffuse_btdf(color) {
  if (view and light on opposite hemispheres) {
    return (1/pi) * color
  } else {
    return 0
  }
}

function mix(bsdf0, bsdf1, factor) {
  return (1-factor) * bsdf0 + factor * bsdf1
}
Diffuse BRDF Diffuse BTDF

Combining Diffuse Transmission with other Extensions

KHR_materials_transmission

Both KHR_materials_diffuse_transmission and KHR_materials_transmission replace the diffuse BRDF with a mix of diffuse BRDF and a BTDF that transmits light onto the opposite side of the surface. In case of KHR_materials_transmission, this is a microfacet BTDF that shares its roughness with the microfacet BRDF. In case of KHR_materials_diffuse_transmission, on the other hand, this is a diffuse BTDF.

Let's recall the dielectric_brdf for KHR_materials_diffuse_transmission as defined above

dielectric_brdf =
  fresnel_mix(
    ior = 1.5,
    base = mix(
      diffuse_brdf(color = baseColor),
      diffuse_btdf(color = diffuseTransmissionColor),
      diffuseTransmission),
    layer = specular_brdf(α = roughness ^ 2)
  )

and compare it to the dielectric_brdf defined in KHR_materials_transmission

dielectric_brdf =
  fresnel_mix(
    ior = 1.5,
    base = mix(
      diffuse_brdf(baseColor),
      specular_btdf(α = roughness^2) * baseColor,
      transmission),
    layer = specular_brdf(α = roughness^2)
  )

Since the diffuse BTDF does not have controls for roughness, the roughness parameter acts only on the reflective part of the surface. By decoupling the reflection and transmission parts it is possible to configure materials which have a smooth reflection and a diffuse transmission, as shown in images below.

Emissive sphere behind material sample.
Left: Opaque diffuse. Middle: Rough transmission. Right: Diffuse transmission.
0.0 0.2 0.4
Translucent sphere with varying roughness.
0.0 0.2 0.4
Transmissive sphere with varying roughness.

If KHR_materials_transmission is used in combination with KHR_materials_diffuse_transmission, the transmission effect overrides the diffuse transmission effect.

We can formalize this behavior by combining the two cases from above

dielectric_brdf =
  fresnel_mix(
    ior = 1.5,
    base = mix(
      diffuse_bsdf,
      specular_btdf(α = roughness^2) * baseColor,
      transmission),
    layer = specular_brdf(α = roughness^2)
  )

diffuse_bsdf = mix(
    diffuse_brdf(color = baseColor),
    diffuse_btdf(color = diffuseTransmissionColor),
    diffuseTransmission)
1.0 0.75 0.5 0.25 0.0
Dragon with fixed diffuseTransmissionFactor of 1.0 and varying transmissionFactor.

(dragon model from Stanford 3D Scanning Repository)

KHR_materials_volume

When KHR_materials_diffuse_transmission is combined with KHR_materials_volume, a diffuse transmission BTDF describes the transmission of light through the volume boundary. The object becomes translucent. The light transport inside the volume is solely handled by KHR_materials_volume and is not affected by the surface BSDF.

0.0 0.5 1.0
Dragon with white base color, colored volume attenuation and varying diffuseTransmissionFactor.
0.0 0.25 0.5
Candle with off-white base color, colored volume attenuation and varying diffuseTransmissionFactor.

(candle model by lucatorcigliani with modifications by @emackey. Original source CC-BY 4.0)

Schema

Copyright 2025 The Khronos Group Inc.

Some parts of this Specification are purely informative and do not define requirements necessary for compliance and so are outside the Scope of this Specification. These parts of the Specification are marked as being non-normative, or identified as Implementation Notes.

Where this Specification includes normative references to external documents, only the specifically identified sections and functionality of those external documents are in Scope. Requirements defined by external documents not created by Khronos may contain contributions from non-members of Khronos not covered by the Khronos Intellectual Property Rights Policy.

This specification is protected by copyright laws and contains material proprietary to Khronos. Except as described by these terms, it or any components may not be reproduced, republished, distributed, transmitted, displayed, broadcast or otherwise exploited in any manner without the express prior written permission of Khronos.

This specification has been created under the Khronos Intellectual Property Rights Policy, which is Attachment A of the Khronos Group Membership Agreement available at www.khronos.org/files/member_agreement.pdf. Khronos grants a conditional copyright license to use and reproduce the unmodified specification for any purpose, without fee or royalty, EXCEPT no licenses to any patent, trademark or other intellectual property rights are granted under these terms. Parties desiring to implement the specification and make use of Khronos trademarks in relation to that implementation, and receive reciprocal patent license protection under the Khronos IP Policy must become Adopters and confirm the implementation as conformant under the process defined by Khronos for this specification; see https://www.khronos.org/adopters.

Khronos makes no, and expressly disclaims any, representations or warranties, express or implied, regarding this specification, including, without limitation: merchantability, fitness for a particular purpose, non-infringement of any intellectual property, correctness, accuracy, completeness, timeliness, and reliability. Under no circumstances will Khronos, or any of its Promoters, Contributors or Members, or their respective partners, officers, directors, employees, agents or representatives be liable for any damages, whether direct, indirect, special or consequential damages for lost revenues, lost profits, or otherwise, arising from or in connection with these materials.

Vulkan is a registered trademark and Khronos, OpenXR, SPIR, SPIR-V, SYCL, WebGL, WebCL, OpenVX, OpenVG, EGL, COLLADA, glTF, NNEF, OpenKODE, OpenKCAM, StreamInput, OpenWF, OpenSL ES, OpenMAX, OpenMAX AL, OpenMAX IL, OpenMAX DL, OpenML and DevU are trademarks of The Khronos Group Inc. ASTC is a trademark of ARM Holdings PLC, OpenCL is a trademark of Apple Inc. and OpenGL and OpenML are registered trademarks and the OpenGL ES and OpenGL SC logos are trademarks of Silicon Graphics International used under license by Khronos. All other product names, trademarks, and/or company names are used solely for identification and belong to their respective owners.