Lightmaps remove per-frame shadow and lighting cost for static lights on static geometry.
ApplicationregistersLightmapper; manualAppOptionsbootstraps setlightmapper = Lightmapper.- On the light, set
bake = true; once every mesh it lights is lightmapped, setaffectDynamic = false. - On each mesh, set
render.lightmapped = true, or it goes unlit onceaffectDynamicis off. Size it withlightmapSizeMultiplier;castShadowsLightmaplets meshes shadow each other. - Set the mode on
scene.lightmapMode:BAKE_COLORfor flat diffuse, or the defaultBAKE_COLORDIR, which adds direction for normal- or specular-mapped materials. - Bake AO without lights with
scene.ambientBake,ambientBakeNumSamples, andambientBakeOcclusionBrightnessandambientBakeOcclusionContrast. - The Engine bakes once on the first rendered frame. Call
app.lightmapper.bake(null, mode)only for nodes added later or to re-bake.
A second UV set is required
A node bakes only when every mesh instance has SEMANTIC_TEXCOORD1. Otherwise it is skipped, with
only a debug-build log, and stays dynamically lit. Primitives have the set; imported GLBs often do
not. Check, then unwrap or re-export.
On-device or offline
Time bake() on the target device. Move to an offline bake shipped as textures only when it misses
the startup budget or needs detail the runtime lightmapper cannot produce, and state the added
download size.
Dynamic objects moving through baked light need approximated occlusion and a contact shadow, or
they look pasted on. Compare verify-pixels captures in and out of baked shadow.