Skip to main content

Normal and bump mapping

Normal and height textures add apparent fine surface detail without increasing mesh tessellation.

The BumpMaterial sample demonstrates this capability. Drag to orbit and scroll to zoom.

GitHub
Loading examplePreparing GPU resources…

PBRMaterial reference​

PBRMaterial from @luma.gl/experimental is a typed engine Material backed by the shared pbrMaterial shader module. Its material fields are defined by PBRMaterialUniforms from @luma.gl/shadertools. Pass them through createPBRMaterial(device, {uniforms}) or update them with material.setProps({pbrMaterial: {...}}).

The fields below are optional. Defaults are the shared shader defaults; imported assets can supply other values.

FieldTypeDefaultDescription
normalScalenumber1Scale of tangent-space normal-map perturbations.
normalMapEnabledbooleanfalseEnables normal texture sampling.
bumpFactornumber1Scale of height-derived normal perturbations.
bumpMapEnabledbooleanfalseEnables height texture sampling.

PBRMaterialBindings​

Texture resources are supplied separately through PBRMaterialBindings. Each field below is optional and accepts Texture | null. createPBRMaterial() derives map-enabled flags from these resources. Enable the corresponding Model shader define listed below when supplying a texture; the helper does not choose the model shader defines.

FieldModel defineDescription
pbr_normalSamplerHAS_NORMALMAP: trueTexture resource for the normal slot.
pbr_bumpSamplerHAS_BUMPMAP: trueTexture resource for the bump slot.

Supporting APIs​

createPBRMaterial​

createPBRMaterial(device, {uniforms, bindings, factory}) from @luma.gl/experimental returns a PBRMaterial. uniforms sets the fields listed above, bindings supplies material textures, and the optional factory shares a compatible binding schema across materials. The helper derives map-enabled flags from the supplied bindings; explicit uniform values take precedence.

MaterialFactory​

createPBRMaterialFactory(device) from @luma.gl/experimental creates a reusable engine MaterialFactory configured with the pbrMaterial shader module. Pass this factory to createPBRMaterial() when creating several compatible materials.

Material​

Material from @luma.gl/engine owns material uniforms and texture resources. setProps({pbrMaterial: {...}}) updates uniform values. Pass the material to a compatible Model through its material prop; models sharing it observe the same updates. Use clone({bindings: {...}}) when an appearance needs separate texture resources. Adding a texture or changing a shader feature may require matching defines and a compatible model shader layout.

See the materials guide and pbrMaterial reference.

Usage​

import {createPBRMaterial, type PBRMaterial} from '@luma.gl/experimental';

// device is an initialized Device.
const material: PBRMaterial = createPBRMaterial(device, {
uniforms: {
normalScale: 1,
bumpFactor: 0.05
}
});

// Pass material to a compatible Model through its material prop.

The snippet sets the detail scales only; it needs the appropriate texture bindings and shader defines to produce surface detail. Neither technique displaces mesh vertices.

See normal mapping for dedicated core glTF samples and a texture-binding example.

glTF support​

Core glTF normalTexture supplies normal maps. The experimental, unratified EXT_materials_bump proposal supplies a linear red-channel height texture. The adapter preserves per-slot UV transforms and composes bump perturbations with conventional normal maps.

See glTF materials and textures, glTF animation, and the extension support matrix for adapter details and current support limits.

All engine features