Original Galaxy HDR output
All native addresses below are RVAs in the pinned4.4.2.0 image, SHA256
6891f70a021fa9f3a0e00458c284f48d1226e68ae7fc02ad48081aed47857e93.
This is offline source evidence, not a live read of the current client's options.
Shared scene scaling
Extract-GalaxyHdrReflection.py independently ties GalaxyGlow's CameraPos
reflection offset4672 to original PS register cb1[275].xyz. The same shared
data range begins at272, so HDRScalingWrite1716 and HDRScalingRead1720 are
cb1[90].y/z. Actual native publisher27F6EB0→28783B0 reads the view's
36CC/36D0 fields; constructor27FBE00 writes1/256 and256. Another mode has a
separate pair with the same defaults. Per-view runtime overrides remain unknown.
GalaxyGlow's original PS emits colour * sqrt(Read) * Write, alpha1. With the
controlled SourceColor/One blend, its squared RGB is stored with a factor1/256;
the final HDR Read256 cancels that factor. Using only Write1/256 without the
final read is incorrect. DistantMilkyWay's PS has only Write, so it must not be
given the same blend/scaling conclusion without its actual compiled state.
Actual final shader library
The final HDR programs are embedded in the PE, separate from Effects.arc. HDR node351F8E0, vtable54C7468, renders at3526320. Its shadow is created by 3527600→351F450, which invokes program initializer3521E90.
Extract-GalaxyHdrPrograms.py verifies the pinned image, actual platform/blob
descriptors, compressed sizes, inflated sizes, every shader SHA and reflection.
It reads no game process and makes no game calls.
| Role | Descriptor RVA | Blob RVA | Inflated bytes |
|---|---|---|---|
| Final HDR | 54C4548 | 53980C0 | 28284792 |
| Auto exposure | 54C6248 | 54C4568 | 95472 |
| Luminance downscale | 54C6920 | 54C6268 | 5408 |
Final HDR inflated SHA256 is
c9cbe6ed3816ef95b426682d8958ea8340d72a56e79f9f9ff8185877baaecb18.
The xfxd3f first frozen object's pass table is at388, count9, stride70hex.
| Pass | Original name |
|---|---|
| 0 | LuminanceFilter |
| 1 | LuminanceDownsampleInitial |
| 2 | LuminanceDownsample |
| 3 | ApplyToneMapping_LinearColor |
| 4 | ApplyToneMapping_LinearColorRGBM |
| 5 | ApplyToneMapping_FilmicU2_ManExposure |
| 6 | ApplyToneMapping_FilmicU2_Log2LumExposure |
| 7 | ApplyToneMapping_FilmicACES_ManExposure |
| 8 | ApplyToneMapping_FilmicACES_Log2LumExposure |
Node124 constructor default2 copies to shadow6C4; node120 default0 copies to shadow6C8. The tail of35225B0 selects pass5 for that pair. These defaults do not prove that another setting/configuration writer never overrides them.
Shadow handle7F0 is c_bloomBlendWeight, not a tone-map method. Its source
shadow6C0 must not be used to infer the selected curve. Handle7F8 is the actual
c_hdrBufferScalingRead, dereferenced from the shadow40 pointer. The extractor
exports the complete native handle/name table to avoid guessed names.
Default U2 parameters and exact GPU layout
351F8E0 first writes standard Hable values, then overwrites them at351FBC1..351FC04. The overwritten values are the ones used by the offline default helper.
| Parameter | Exact float bits |
|---|---|
| Shoulder strength A | 3EFB645A |
| Linear strength B | 3F34FDF4 |
| Linear angle C | 3F343958 |
| Toe strength D | 3F97AE14 |
| Toe numerator E | 3FB04189 |
| Toe denominator F | 3FFCED91 |
| Linear white W | 40A7BE77 |
The curve is ((A*x+B*C)*x+D*E)/((A*x+B)*x+D*F)-E/F, divided by its value at W.
Constructor defaults EV0, gamma2.2, brightness/contrast/saturation1.35225B0
enables colour adjustment and supplies reciprocal gamma and the contrast pivot.
The actual original neutral-U2-with-colour-adjust PS has SHA256
425b3ddca23b606d0501a9cde6047278c3ff0f5153853d12ae1e32e0fb3300da.
Its option6 is c_colourAdjustEnable, established by the original16B option
records, rather than inferred from filename order.
The second frozen object has77 variable descriptors. Native4FC6E0 decodes their
u16 at+A: offset=(packed>>1)&7FFC, bank=packed&3. CB2 data starts at80,
cross-checked independently with read112→cb2[2].x, shoulder128→cb2[3].x,
reciprocal gamma232→cb2[9].z. The helper exports11 float4s in this exact layout.
Validation and limits
research/GalaxyHdrShaderProbe uses WARP and R32 output to compare the translated
PS with the actual original DXBC. Five RGB input groups, from black through
10000 linear intensity, have maximum difference0. Three authored Core views
render to R16 float with explicit original default Write/Read, then both final
PS paths produce identical full R32 images (difference0, no NaNs).
The generated sol/centre/above PNGs have been viewed. They preserve grey/purple and warm Core variation; the controlled centre mean RGB is .343, rather than the raw SDR white clipping seen in the application. This is a controlled shader comparison, not proof that the complete application visually matches the game.
The probe additionally links the production MilkyWay partial, waits for15824 original source cloud instances, and tests each of the three views with/without clouds on the same floating point target. All six final images match the actual original final PS with difference0 and no nonfinite values. A separate production MW Write1 versus Write1/256 test compares425178 nontrivial RGB values after Read256: mean difference2.79e-5, maximum.0004883 from R16 quantisation. It verifies the actual production parameter reaches the GPU, rather than testing a fixture that silently ignores Write. The three cloud images have been viewed individually.
The new HDR partial is deliberately separate: Begin binds R16 float, End runs
the default U2 pass. Each source pass must supply its own proven HDR inputs and
blend state. Bloom, LUT, auto exposure, runtime settings and other render layers
are not restored by this change. FullRestored remains false.