Skip to content

PRD-632: expose the frame like a fresh Unreal project - #607

Draft
jonit-dev wants to merge 11 commits into
developfrom
prd/632-filmic-exposure
Draft

jonit-dev wants to merge 11 commits into
developfrom
prd/632-filmic-exposure

Conversation

@jonit-dev

Copy link
Copy Markdown
Contributor

What is this PR about?

A fresh ThreeNative scene now exposes the frame the way a fresh Unreal 5.8.3 project does (PRD-632).

Why does it matter?

The L1 ladder cells were up to 0.4 EV brighter than Unreal. The cause was an effective exposure of pi, where Unreal uses 2.4 with its meter off. Every template inherits this exposure.

Done

  • ✅ The sun is Unreal's 6 lux (SUN_ILLUMINANCE = SUN_LUX). The SKY_TO_SUN and EMISSIVE_UNITS factors are deleted.
  • ✅ The fixed exposure is 2^bias x 1.2 = 2.4 (UE 5.8.3: SceneView.cpp:2060-2069, PostProcessEyeAdaptation.cpp:810-821).
  • ✅ The shooter and action-rpg ACES overrides keep their owner-picked brightness (0.62 x pi).
  • ✅ Harness L1: 22/84 rows pass before, 61/84 after. Every non-floor region passes.

Still open

  • ⚠️ The grazing-sun floor (sun15, sun04) is 3 to 6 levels darker than Unreal (BSDF gap).
  • ⚠️ AC-2 (L9 exposure), AC-3 (judge), the template gate and the template AGENTS.md wording.

…'s 2.4 (PRD-632)

The atmosphere sun was 6 x pi "lux" at exposure 1, an effective exposure of
pi where Unreal exposes by 2.4 with its meter off: 2^bias x 1.2, from the
average SceneView.cpp:2060-2069 pins and key / average
(PostProcessEyeAdaptation.cpp:810-821). Three's Lambert and Unreal's shade
lux alike, so the sun is now 6, the emissive takes no pi and the sky loses
SKY_TO_SUN: its "1.3x too bright, cause not found" fit was this same
pi / 2.4 = 1.309.

Unreal L1, 12 cells, RTX 2080: 22 -> 61 of 84 rows pass; every region but
the floor under the 15 and 4 degree suns passes (Box_White 235/247 against
235/247). A ?exposure=0.764 knob arm on the old code gave the same rows.
The kits that pin ACES at a fixed 0.62 (shooter, action-rpg) take 0.62 pi,
so their sunlit surfaces stay where the owner chose them.

Specs: unreal-look-light red on the old constants (3 fail) -> green.
@jonit-dev jonit-dev added the prd:50% PRD half the phases verified label Nov 3, 2026
… slab (PRD-632)

A fresh Unreal 5.8.3 project (Substrate, GBuffer format 0) compiles its energy
conservation off: the diffuse keeps all the light and the specular takes no
multi-scattering weight (ShadingEnergyConservation.ush:7-31). three r187 and the
owned engine took 1 - F_Schlick(VoH) from the diffuse, which darkened a floor as
the sun neared the horizon. The roughDiffuse (Substrate) path now drops both
terms, on three's lighting hook and in the owned engine's standard program.

The starter ships shadeLikeSubstrate, the harness calls the template's own in
both arms, and below L2 both arms light the sun with no air transmittance
(r.SkyAtmosphere 0). Every template AGENTS.md states the filmic default, the
6 lux sun, the fixed 2.4 exposure and the overrides.

L1 against Unreal: harness 61/84 -> 70/84, starter 18/84 -> 72/84. The rest is
the floor under the 4 degree sun.
…s the pre-PRD-632 starter look (AC-3 BEFORE arm)
…ecularColor and specularF90; owned web parity serves isolated pages with the threads Wasm

rough-diffuse.ts (PRD-632) reads three's Fresnel nodes on three's renderer; the native player bundle refused them
(TN_NATIVE_ENGINE_UNBOUND). The owned web lane failed TN_WEB_THREADS_OFF, then the threads .wasm fetch.
rough-diffuse parity: web owned Wasm pass, desktop V8 engine player pass (mismatch 0, deltaE 0) against it.
@jonit-dev jonit-dev added prd:75% PRD phases in, acceptance open and removed prd:50% PRD half the phases verified labels Nov 3, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

prd:75% PRD phases in, acceptance open

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant