From f4c02344fdee049f72d198051b8750b9e4b012d4 Mon Sep 17 00:00:00 2001 From: jturnley Date: Sun, 15 Mar 2026 17:16:46 -0700 Subject: [PATCH] fix: preserve vanilla water TAA when no upscaler is active ConfigureTAA() unconditionally set enableWaterTAA=false and taaEnabled=false when UpscaleMethod was kNONE. This disabled ISWaterBlend's 95% temporal history blend, causing water surfaces to flicker between transparent, white, and normal reflections during camera movement (~6s convergence when stationary as auto-exposure settles). Early return for kNONE preserves vanilla TAA behavior. For kTAA, disable water TAA since CS TAA handles it. For kFSR/kDLSS, keep water TAA enabled. Fixes #1979 --- src/Features/Upscaling.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/Features/Upscaling.cpp b/src/Features/Upscaling.cpp index 604f49e986..f189d8301d 100644 --- a/src/Features/Upscaling.cpp +++ b/src/Features/Upscaling.cpp @@ -1029,15 +1029,22 @@ void Upscaling::ConfigureTAA() { auto upscaleMethod = GetUpscaleMethod(); + // When no upscaling method is active, leave vanilla TAA state untouched. + // The original UpdateJitter (called after this) manages water TAA and jitter + // correctly for the non-upscaling case. Overriding here disables ISWaterBlend, + // removing the 95% temporal history blend that stabilizes water reflections. + if (upscaleMethod == UpscaleMethod::kNONE) + return; + auto imageSpaceManager = RE::ImageSpaceManager::GetSingleton(); GET_INSTANCE_MEMBER(BSImagespaceShaderISTemporalAA, imageSpaceManager); - // Disable water TAA when upscaling is enabled + // CS TAA replaces vanilla TAA entirely, so disable water TAA (CS handles it). + // For FSR/DLSS, keep water TAA enabled since the upscaler needs the blend data. bool* enableWaterTAA = reinterpret_cast(reinterpret_cast(BSImagespaceShaderISTemporalAA) + 0x38LL); - *enableWaterTAA = !(upscaleMethod == UpscaleMethod::kNONE || upscaleMethod == UpscaleMethod::kTAA); + *enableWaterTAA = (upscaleMethod != UpscaleMethod::kTAA); - // Force enable TAA if needed - BSImagespaceShaderISTemporalAA->taaEnabled = upscaleMethod != UpscaleMethod::kNONE; + BSImagespaceShaderISTemporalAA->taaEnabled = true; } void Upscaling::ConfigureUpscaling(RE::BSGraphics::State* a_viewport)