ReadonlynameHuman-readable identifier used in graph node labels and error messages.
Light-culling strategy.
'clustered' (default) bins point lights into a 3D froxel grid (screen
cells × exponential depth slices) whose bounds come purely from the
projection — so it reads no depth and the depth pre-pass is dropped
entirely. Each fragment looks up its own froxel by view-Z, which also
lights transparents correctly (the tiled slab is derived from opaque
depth only).'tiled' bins them into 16×16 screen tiles, reducing a near→far depth
slab per tile from a depth pre-pass.
Both pipelines compile up front, so this can flip per-frame.When true the shading pass renders the per-cell light-count heatmap instead of the lit scene. Useful for visualizing the culling result.
G-buffer-style channel visualization (0 = off / lit). Matches the deferred lighting shader's debugMode numbering so a channel reads the same in either renderer: 1 albedo · 2 normals · 3 metallic · 4 roughness · 5 emission · 6 occlusion · 7 specular · 8 material id · 9 texture coords. The deferred G-buffer can't carry UV, so mode 9 is forward-only. debugTiles (the light-count heatmap) takes precedence when set.
Ambient-IBL multiplier written into the lighting uniform (iblIntensity).
1 = full daytime IBL; lower it to dim baked ambient (e.g. at night) so the
forward+ path matches the deferred path's iblIntensity control.
Runtime LTC toggle (only meaningful when the LTC variant is compiled). Written into LightingUniforms.areaLightLtc each frame.
Sort transparent items back-to-front before rendering. Default true.
Skip the aerial-perspective haze. Defaults true (opt-in) so existing
forward+ scenes are unchanged; the feature sets it each frame.
StaticcreateEVSM2 sampling params (only meaningful when this pass was built with the
shadowFilter: 'vsm' variant). exponent must match what
DirectionalVsmPass baked the moments at. Takes effect next frame.
Virtualised-clipmap (shadowMode 2) pool atlas params: slots per atlas row + atlas dimensions in texels (for the page-table indirection).
Splits the draw list into opaque (depth-write, no blend) and transparent
(alpha-blend, no depth-write) buckets. The depth pre-pass — when not
bypassed via ForwardPlusDeps.externalDepth — only rasterizes the
opaque bucket; transparents render after opaques in the shading pass,
sorted back-to-front when sortTransparent is true.
Set the list of skinned (GPU-skinned animated) draws. Opaque skinned items participate in the depth pre-pass — so the light-culling tile bounds see the live pose — and in the tile-shaded forward+ pass. Transparent skinned items only draw in the shading pass (back-to-front when sortTransparent is true), with depth-write disabled.
Uploads per-frame camera, culling, point-light and directional-light data.
Call once per frame after camera.updateRender(ctx) and before
addToGraph.
Atmosphere params used by the aerial-perspective haze. Mirrors DeferredLightingPass.setAerialAtmosphere; pass the same params given to the sky so geometry haze matches the sky behind it.
Enable / configure screen-space contact shadows for the sun. When enabled
(steps > 0) the pass forces its opaque depth pre-pass to run (even in
clustered mode) and the shading shader marches that depth toward the sun.
Pass null / steps: 0 to disable (the default). Mirrors
DeferredLightingPass.setContactShadows.
Put the aerial fog into curved-horizon (planet) mode about center, or back
to flat-world mode with null. Mirrors DeferredLightingPass.setAerialPlanetCenter.
Insert the pass into graph for one frame. Implementations call
graph.addPass(name, type, b => { ... }) exactly once and use the
supplied PassBuilder to declare reads, writes, transient
resources, and the execute callback.
Graph being built this frame.
Pass-specific dependency record (handles, scene data, etc.).
Pass-specific output record (typically a set of handles downstream passes will consume).
Release every long-lived GPU resource owned by the pass (pipelines, persistent uniform buffers, samplers, BGLs). Called by the factory or application during teardown. Default implementation is a no-op.
Forward+ (tiled forward) render pass.
Runs three graph passes per frame:
render) — rasterizes geometry depth only.compute) — one workgroup per 16×16 tile derives the tile's view-space frustum from the depth bounds and tests every point light's bounding sphere against it, writing a per-tile light index list.render) — re-renders geometry with full PBR; the fragment shader iterates only the point lights its tile received.The directional sun (with cascaded shadows) and IBL ambient are evaluated globally; only point lights are tile-culled. Many hundreds of point lights stay cheap because each fragment touches at most
MAX_LIGHTS_PER_TILE.