Skip to content

Volume

glTF extension: KHR_materials_volume
glTF properties: thicknessFactor · thicknessTexture · attenuationDistance · attenuationColor

Volume describes how light is absorbed and colored as it travels through the interior of a solid object. It works together with a transmission-capable material, typically KHR_materials_transmission in this exporter. Transmission controls how much light enters the surface; volume controls what happens to that light inside. Requires KHR_materials_volume to be enabled in the export options.

Shader Thickness attribute Attenuation distance Attenuation color Notes
standardSurface, aiStandardSurface thickness transmissionDepth transmissionColor
openPBRSurface thickness transmissionDepth transmissionColor
StingrayPBS not supported not supported not supported -

Thickness

Thickness represents the depth of material a ray travels through. In glTF the thickness value is stored in the green channel of thicknessTexture. A thicknessFactor of 0.0 means the surface is infinitely thin and no volume effect is written.

Volume behavior assumes a closed, manifold mesh. Per the glTF spec, doubleSided does not change a true volume boundary.

Factor only

Set thickness directly on the shader. The exporter only writes a volume extension when the value is greater than 0.0.

Exports as thicknessFactor.

Factor-only volume connection for standardSurface
standardSurface factor-only volume setup.

Factor-only volume connection for aiStandardSurface
aiStandardSurface factor-only volume setup.

Factor-only volume connection for openPBRSurface
openPBRSurface factor-only volume setup.

Texture only

Color space: Raw

standardSurface · aiStandardSurface · openPBRSurface:
  aiImage.outColorG  →  shader.thickness
  file.outColorG     →  shader.thickness

The exporter converts any source channel into the green channel of a dedicated thickness image. The original factor is exported separately as thicknessFactor.

Exports as thicknessTexture (G channel).

Texture-only volume connection for standardSurface using file and place2dTexture
standardSurface texture-only volume setup with file and place2dTexture.

Texture-only volume connection for aiStandardSurface using file and place2dTexture
aiStandardSurface texture-only volume setup with file and place2dTexture.

Texture-only volume connection for openPBRSurface using file and place2dTexture
openPBRSurface texture-only volume setup with file and place2dTexture.

Factor + texture

glTF computes: thicknessFactor × thicknessTexture.G

  1. Connect the thickness texture into a multiplyDivide node.
  2. Set the thickness multiplier in multiplyDivide.input2X.
  3. Connect multiplyDivide.outputXshader.thickness.
standardSurface · aiStandardSurface · openPBRSurface:
  texture.outColorG  →  multiplyDivide.input1X  →  shader.thickness

The multiplier exports as thicknessFactor.

Volume factor plus texture connection for standardSurface using file and place2dTexture
standardSurface factor-plus-texture volume setup with file and place2dTexture.

Volume factor plus texture connection for aiStandardSurface using file and place2dTexture
aiStandardSurface factor-plus-texture volume setup with file and place2dTexture.

Volume factor plus texture connection for openPBRSurface using file and place2dTexture
openPBRSurface factor-plus-texture volume setup with file and place2dTexture.


Attenuation distance

Attenuation distance sets how far light travels before it is fully absorbed. Maps from the transmissionDepth attribute. The exporter only writes this value when it is a positive, finite number - 0.0 and inf are both skipped.

standardSurface · aiStandardSurface · openPBRSurface:
  set transmissionDepth  →  exports as attenuationDistance

Note

Attenuation distance is a scalar-only property. There is no texture path for attenuationDistance in glTF, and the valid range is strictly greater than 0.0.


Attenuation color

Attenuation color tints the light as it is absorbed. Maps from the transmissionColor attribute. The exporter only writes this value when it differs from the default white [1, 1, 1] (white = no absorption).

standardSurface · aiStandardSurface · openPBRSurface:
  set transmissionColor  →  exports as attenuationColor

Note

Attenuation color is a scalar-only property. There is no texture path for attenuationColor in glTF.

Shared attribute with diffuse transmission

transmissionColor is also used by the diffuse transmission workflow. When a diffuse transmission graph is active on the same shader, transmissionColor is reserved for KHR_materials_diffuse_transmission and is not exported as attenuation color. To use volume attenuation color, use a classic transmission setup without an active diffuse transmission graph on the same material.


UV transform (thickness texture)

file nodes: set repeat, wrap, mirror, offset, and rotation on the connected place2dTexture.
aiImage nodes: wrap, scale, and offset export natively; rotation requires a place2dTexture.

UV set: assign via Maya's UV Set Editor or UV Linking - see UV Set Selection for node-type differences.


Notes

  • Volume is only meaningful when light can enter the surface. In this exporter, combine it with KHR_materials_transmission for realistic glass or solid translucent objects.
  • Thickness texture is always written in the green channel by the exporter, regardless of the source channel in Maya.
  • A thickness of 0.0 disables volume export entirely. Set it above 0.0 to activate the extension.
  • attenuationDistance and attenuationColor are scalar-only properties with no glTF texture slot.
  • A true volume boundary should be authored on a closed mesh; doubleSided does not make an open mesh volumetric.
  • StingrayPBS does not export KHR_materials_volume.