Static geometry lit by static lights can bake into lightmap textures once, removing per-frame
shadow-map rendering and per-pixel dynamic lighting for that light entirely.
Procedural primitives auto-generate a usable UV set; imported GLB models often do not ship a second,
non-overlapping UV channel suitable for a lightmap atlas. Read the installed engine's source for
what its
actually requires — which UV set it samples, whether it unwraps one for you —
before assuming a real model will bake correctly. Do not carry a primitive-only test result into
production assets unchecked.
On-device bake cost scales with baked-node count and lightmap resolution; estimate it against the
startup budget before choosing a rung. Stay on-device unless:
Only then move to an offline bake shipped as assets, following the same shape as any other
generated-asset pipeline: registry-keyed per-asset configs (a new asset is a config change, not new
pipeline code), a CLI with per-target fast paths, staged size logging, worker-thread parallelism for
build time, and a coverage self-audit that fails the bake when an expected output is missing or
empty.
Whichever rung you use, dynamic objects moving through baked lighting must not read as ignoring it:
sample or approximate the baked occlusion/shadow field for them and their attachments so they dim to
the same levels as the static geometry around them, and ground them with a contact shadow. A
dynamic object whose custom shading must meet baked maps is
territory.
Capture
-style frames both in and out of the baked shadow, before and after the
change, and compare them. A screenshot glanced at once is not proof the bake reproduced the lighting
it removed.