Add ACES 2.0 HDR display pipeline - #35
Merged
Merged
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Testing
.\gradlew.bat test