diff --git a/src/Ryujinx.Common/Configuration/AntiAliasing.cs b/src/Ryujinx.Common/Configuration/AntiAliasing.cs
index 1510c23ee..f6cdc39f9 100644
--- a/src/Ryujinx.Common/Configuration/AntiAliasing.cs
+++ b/src/Ryujinx.Common/Configuration/AntiAliasing.cs
@@ -11,5 +11,6 @@ namespace Ryujinx.Common.Configuration
SmaaMedium,
SmaaHigh,
SmaaUltra,
+ Taa,
}
}
diff --git a/src/Ryujinx.Graphics.OpenGL/Window.cs b/src/Ryujinx.Graphics.OpenGL/Window.cs
index 281fae7e7..c597e2d30 100644
--- a/src/Ryujinx.Graphics.OpenGL/Window.cs
+++ b/src/Ryujinx.Graphics.OpenGL/Window.cs
@@ -324,6 +324,7 @@ namespace Ryujinx.Graphics.OpenGL
_antiAliasing = new FxaaPostProcessingEffect(_renderer);
break;
case AntiAliasing.None:
+ case AntiAliasing.Taa: // TAA is a Vulkan-only effect; on the GL backend it falls back to no AA.
_antiAliasing?.Dispose();
_antiAliasing = null;
break;
diff --git a/src/Ryujinx.Graphics.Vulkan/Effects/TemporalFilter.cs b/src/Ryujinx.Graphics.Vulkan/Effects/TemporalFilter.cs
index 9260b3dff..6d577a322 100644
--- a/src/Ryujinx.Graphics.Vulkan/Effects/TemporalFilter.cs
+++ b/src/Ryujinx.Graphics.Vulkan/Effects/TemporalFilter.cs
@@ -20,10 +20,10 @@ namespace Ryujinx.Graphics.Vulkan.Effects
/// the dominant cost), then the field is bilinear-upscaled and scaled by N when the blend reprojects the
/// history. Motion estimation is self-contained (reuses the DLSS shaders) so TAA works with DLSS off.
///
- /// Gated entirely on RYUJINX_TAA=1: when unset the present path never constructs or runs this, so the
- /// default render is byte-identical. Tunables (no rebuild): RYUJINX_TAA_BLEND (history weight, default
- /// 0.90), RYUJINX_TAA_MV_SIGN (reprojection direction, default +1), RYUJINX_TAA_CLAMP (variance-box
- /// half-width in std-devs, default 1.0), RYUJINX_TAA_MV_DOWNSCALE (flow resolution divisor 1/2/4, default 2).
+ /// Selected from the UI as an Anti-Aliasing option (AntiAliasing.Taa); RYUJINX_TAA=1 also force-enables it
+ /// (dev override). Tunables (no rebuild): RYUJINX_TAA_BLEND (history weight, default 0.80), RYUJINX_TAA_MV_SIGN
+ /// (reprojection direction, default +1), RYUJINX_TAA_CLAMP (variance-box half-width in std-devs, default 1.25),
+ /// RYUJINX_TAA_MV_DOWNSCALE (flow resolution divisor 1/2/4, default 2).
///
internal class TemporalFilter : IPostProcessingEffect
{
@@ -91,7 +91,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects
return blend;
}
- return 0.90f;
+ return 0.80f; // validated in-game default (sharp + steady); RYUJINX_TAA_BLEND overrides.
}
private static float ParseSign()
@@ -113,7 +113,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects
return gamma;
}
- return 1.0f;
+ return 1.25f; // validated in-game default (lets native texture detail through); RYUJINX_TAA_CLAMP overrides.
}
private static int ParseDownscale()
diff --git a/src/Ryujinx.Graphics.Vulkan/Window.cs b/src/Ryujinx.Graphics.Vulkan/Window.cs
index 0466bf87a..264528ad2 100644
--- a/src/Ryujinx.Graphics.Vulkan/Window.cs
+++ b/src/Ryujinx.Graphics.Vulkan/Window.cs
@@ -37,7 +37,6 @@ namespace Ryujinx.Graphics.Vulkan
private bool _updateEffect;
private IPostProcessingEffect _effect;
private IScalingFilter _scalingFilter;
- private Effects.TemporalFilter _taa;
private Dlss.DlssUpscaler _dlss;
private bool _isLinear;
private float _scalingFilterLevel;
@@ -395,14 +394,6 @@ namespace Ryujinx.Graphics.Vulkan
view = _effect.Run(view, cbs, _width, _height);
}
- // Native temporal anti-aliasing (clean-room), gated on RYUJINX_TAA=1. Runs at render resolution
- // before the spatial upscale/blit, like a post-processing effect. Phase 0 is a pass-through.
- if (Effects.TemporalFilter.IsEnabled)
- {
- _taa ??= new Effects.TemporalFilter(_gd, _device);
- view = _taa.Run(view, cbs, _width, _height);
- }
-
int srcX0, srcX1, srcY0, srcY1;
if (crop.Left == 0 && crop.Right == 0)
@@ -615,12 +606,22 @@ namespace Ryujinx.Graphics.Vulkan
{
_updateEffect = false;
- switch (_currentAntiAliasing)
+ // RYUJINX_TAA=1 forces the native temporal filter regardless of the UI selection (dev override).
+ AntiAliasing antiAliasing = Effects.TemporalFilter.IsEnabled ? AntiAliasing.Taa : _currentAntiAliasing;
+
+ switch (antiAliasing)
{
case AntiAliasing.Fxaa:
_effect?.Dispose();
_effect = new FxaaPostProcessingEffect(_gd, _device);
break;
+ case AntiAliasing.Taa:
+ if (_effect is not Effects.TemporalFilter)
+ {
+ _effect?.Dispose();
+ _effect = new Effects.TemporalFilter(_gd, _device);
+ }
+ break;
case AntiAliasing.None:
_effect?.Dispose();
_effect = null;
@@ -791,7 +792,6 @@ namespace Ryujinx.Graphics.Vulkan
_effect?.Dispose();
_scalingFilter?.Dispose();
- _taa?.Dispose();
_dlss?.Dispose();
}
}
diff --git a/src/Ryujinx/UI/Views/Settings/SettingsGraphicsView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsGraphicsView.axaml
index daf7a08dd..7b3c471cf 100644
--- a/src/Ryujinx/UI/Views/Settings/SettingsGraphicsView.axaml
+++ b/src/Ryujinx/UI/Views/Settings/SettingsGraphicsView.axaml
@@ -290,6 +290,8 @@
Content="{ext:Locale SmaaHigh}" />
+