Skip to content

Add ACES 2.0 HDR display pipeline - #35

Merged
ComfyFluffy merged 33 commits into
mainfrom
aces
Aug 1, 2026
Merged

Add ACES 2.0 HDR display pipeline#35
ComfyFluffy merged 33 commits into
mainfrom
aces

Conversation

@ComfyFluffy

Copy link
Copy Markdown
Owner

Summary

  • add an ACEScg scene-to-display pipeline with packaged look, calibrated exposure, bloom, and atmospheric sky rendering
  • add PQ/HDR presentation, mastering metadata, UI compositing, EXR screenshots, and baked SDR/HDR LUTs
  • reorganize shader pipelines and generated bindings around the new rendering path
  • expose live HDR controls with fixed peak-nits steps, simplify user-facing config comments, and remove the obsolete look-package guide

Testing

  • .\gradlew.bat test

ComfyFluffy and others added 30 commits July 27, 2026 19:23
…ly runtime-toggleable

Adds an ACES 2.0 display-transform path (SDR + 500/1000/2000/4000-nit HDR LUTs baked offline
via OCIO) as an A/B alternative to the existing AgX/rolloff operators, selectable live via
caustica.rt.tonemap.mode. The old code stays in place until the new path is confirmed further
in play.

Also makes the HDR enable toggle and peak-nits selection genuine runtime settings instead of
requiring a restart: the swapchain is now always created in PQ when the surface supports it,
independent of the live toggle, so flipping HDR only switches which existing per-frame present
path runs (real HDR vs. SDR converted into the PQ container) rather than needing a new
swapchain. Peak-nits is a stepped options-menu slider now, matching the fixed set of nits
targets ACES 2.0 actually offers, and the loaded HDR LUT hot-swaps live when it changes.

See docs/DISPLAY_TRANSFORM_PLAN.md and docs/EXPOSURE_PLAN.md for the full design writeups.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
ACES 2.0 confirmed working correctly in play (no LUT banding; one lava hue-drift at extreme
brightness, a documented ACES 2.0 characteristic rather than a defect — AgX was masking the
same underlying limitation by crushing to white instead of showing it). With no remaining
reason to keep the A/B path, deletes the original AgX inset/sigmoid/outset, the BT.2020->709
gamut prepass, the per-channel HDR rolloff, and pqEncode — ACES 2.0 is now the only SDR/HDR
display transform. CausticaConfig.Rt.Tonemap loses the mode switch; ACES_EXPOSURE_EV stays,
its rationale reframed now that there's no AgX to compare against.

Also migrates display.comp to Slang (display.comp.slang), matching the world/ shaders and
build.gradle's existing **/*.comp.slang convention, done while it was already being rewritten.
exposure_hist.comp/exposure_resolve.comp migrate similarly when that work starts.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Meter and shape the exposure curve on EV100 (RtSceneUnits) and add
pre-exposure so scene values can move to physical photometric units later
without blowing fp16 range - both stages are algebraically exact no-ops on
today's values (docs/SCENE_UNITS_PLAN.md).

Display-chain push constants (ExposureHistPush/ExposureResolvePush/
DisplayPush/DebugPresentPush, renamed from the generic Push each file used)
now go through generateShaderRecords like WorldPush, closing the
hand-computed-offset bug class that caused a mid-session white screen.

Add an F3 entry for live exposure readout via MC 26.2's DebugScreenEntries
(no mixin needed - access-widened for exactly this).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@ComfyFluffy
ComfyFluffy merged commit 330acd2 into main Aug 1, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant