freshcut: a shared render stack, and the rules for using it
render.module is the seam: a part hands over a table naming which of the
builtin rendering systems it wants, and everything raised is temporary and
tracked on the part own context, so one part can be a lit interior and the
next an ocean without either inheriting the other air. Adding a system is one
row in a lookup table.
freshcut takes exposure, aerial perspective, volumetric light, cascade
placement, contact shadows, debanding and film grain.
Three things this cost, all written down where the next part will read them,
because each looked like a tuning number and was not:
Auto exposure over its full range re-brightens an interior that is already lit
to a photographic level and blows it out. The range here is narrow and sits
below unity. It is not there to find the exposure, only to ride the walk from
the hall into daylight. Past about -0.5 stops of compensation it takes the
metals down with it, because a reflection has no light of its own to fall back
on.
Image-based lighting is NOT used in this part. Its specular term and
environment.capture write the same environment and the last one wins, and what
this hall reflects is the room and its own lamps, which a prefiltered sky
cannot reproduce. Nor is specular = 0 a way to keep both: it does not hand the
environment back to the capture, it removes the environment specular outright
and the metals render black. Its diffuse term has no indoor occlusion and lands
sky irradiance on every wall at full strength, which reads as a flat milky
room whatever the sky is doing.
Both of those read the scene ProceduralSky, which was sitting at midnight with
a deep blue zenith because this part drives its look through a volumetric sky
and nothing had ever updated the component. Any system asking the scene what
the sky is was being told midnight. The part now sets it to the hour it is
actually lit for.
Known and not addressed: the hall metals still read darker than they did
before the stack went in.