summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2026-06-24 13:22:48 -0400
committerAndrew Opalach <andrew@akon.city> 2026-06-24 13:22:48 -0400
commit2fca589444c29b383c00576fe46cf50cc3971cba (patch)
tree5aa68ec86e5de426fdf2e57e165406b0bf1cfd75
parent7cc4ce79e11f1b800dfc10f681d4e8c1198bc57b (diff)
downloadWorldTuningTool-2fca589444c29b383c00576fe46cf50cc3971cba.tar.gz
WorldTuningTool-2fca589444c29b383c00576fe46cf50cc3971cba.tar.bz2
WorldTuningTool-2fca589444c29b383c00576fe46cf50cc3971cba.zip
Progress on full res SSR
Signed-off-by: Andrew Opalach <andrew@akon.city>
-rwxr-xr-xConfig.cs1
-rwxr-xr-xPlugin.cs297
-rw-r--r--[-rwxr-xr-x]Shaders/Original/body_skin.dxbc.xzbin2916 -> 2916 bytes
-rw-r--r--[-rwxr-xr-x]Shaders/Original/color_grading.dxbc.xzbin1584 -> 1584 bytes
-rw-r--r--[-rwxr-xr-x]Shaders/Original/cube_only.dxbc.xzbin2072 -> 2072 bytes
-rw-r--r--[-rwxr-xr-x]Shaders/Original/face.dxbc.xzbin5740 -> 5740 bytes
-rw-r--r--[-rwxr-xr-x]Shaders/Original/fxaa_out.dxbc.xzbin1732 -> 1732 bytes
-rw-r--r--Shaders/Original/sslr_depth_mips.dxbc.xzbin0 -> 1116 bytes
-rw-r--r--Shaders/Original/sslr_mips.dxbc.xzbin0 -> 1112 bytes
-rw-r--r--[-rwxr-xr-x]Shaders/Original/sslr_resolve.dxbc.xz (renamed from Shaders/Original/sslr.dxbc.xz)bin3704 -> 3704 bytes
-rw-r--r--Shaders/Original/sslr_resolve_no_dither.dxbc.xzbin0 -> 3480 bytes
-rw-r--r--Shaders/Original/sslr_resolve_no_jitter.dxbc.xzbin0 -> 3652 bytes
-rw-r--r--Shaders/Original/sslr_resolve_no_jitter_no_dither.dxbc.xzbin0 -> 3200 bytes
-rw-r--r--Shaders/Original/sslr_trace.dxbc.xzbin0 -> 2616 bytes
-rw-r--r--[-rwxr-xr-x]Shaders/Original/sssss.dxbc.xzbin5252 -> 5252 bytes
-rw-r--r--[-rwxr-xr-x]Shaders/Original/volume_upsample1.dxbc.xzbin1700 -> 1700 bytes
-rw-r--r--[-rwxr-xr-x]Shaders/Original/volume_upsample2.dxbc.xzbin2160 -> 2160 bytes
-rw-r--r--Shaders/sslr_mips.diff16
-rw-r--r--Shaders/sslr_resolve.diff29
-rw-r--r--Shaders/sslr_resolve_no_dither.diff30
-rw-r--r--Shaders/sslr_resolve_no_jitter.diff29
-rw-r--r--Shaders/sslr_resolve_no_jitter_no_dither.diff30
-rw-r--r--Shaders/sslr_trace.diff11
23 files changed, 387 insertions, 56 deletions
diff --git a/Config.cs b/Config.cs
index 9c771a9..743abe9 100755
--- a/Config.cs
+++ b/Config.cs
@@ -179,6 +179,7 @@ namespace WorldTuningTool
public struct PatchConfig
{
+ public bool FullResolutionSSLR { get; set; } = false;
public bool FullResolutionVolumeBlur { get; set; } = false;
public bool HigherThanHighestVolumeRendering { get; set; } = false;
public bool DisableLODLimits { get; set; } = false;
diff --git a/Plugin.cs b/Plugin.cs
index 99d9bbc..663ddd1 100755
--- a/Plugin.cs
+++ b/Plugin.cs
@@ -7,6 +7,9 @@
using System.Numerics;
using System.Globalization;
using System.Runtime.CompilerServices;
+#if SHADER_FEATURES
+using System.Runtime.InteropServices;
+#endif
#if ENABLE_ASSERTS
using System.Diagnostics;
#endif
@@ -25,6 +28,7 @@ using SharpPluginLoader.Core.Entities;
// @TODO:
// - Configurable Broad Area Shadow Resolution.
+// - Hook sMhScene constructor to set hqMode.
// - Optimized update logic.
// - Only update non-override values when ui is shown.
// - Map sky params.
@@ -1880,6 +1884,45 @@ namespace WorldTuningTool
setShadowQuality.Invoke(MemoryUtil.Read<int>(sMhScene!.Instance + 0x5530) + 1);
}
+ private bool fullResSSLR = false;
+ private Patch ssrRes1;
+ private Patch ssrRes2;
+ private Patch ssrRes3;
+ private Patch ssrSars1;
+ private Patch ssrSars2;
+ private Patch ssrSars3;
+ private Patch ssrSars4;
+ private Patch ssrSars5;
+ private Patch ssrSars6;
+ private Patch ssrSars7;
+ private Patch ssrSars8;
+ private Patch ssrSars9;
+ private Patch ssrSars10;
+ private Patch ssrSars11;
+ private Patch ssrSars12;
+ private Patch ssrSars13;
+ private Patch ssrSars14;
+ private Patch ssrSars15;
+ private Patch ssrSars16;
+ private Patch ssrSars17;
+ private Patch ssrSars18;
+ private Patch ssrSars19;
+ private Patch ssrSars20;
+ private Patch ssrSars21;
+ private Patch ssrSars22;
+ private Patch ssrSars23;
+ private Patch ssrSars24;
+ private Patch ssrSars25;
+ private Patch ssrSars26;
+ private Patch ssrShr1;
+ private Patch ssrShr2;
+ private Patch ssrShr3;
+ private Patch ssrShr4;
+ private Patch ssrShr5;
+ private Patch ssrShr6;
+ private Patch ssrShr7;
+ private Patch ssrShr8;
+
private bool fullResVolumeBlur = false;
private Patch volumeSars1;
private Patch volumeSars2;
@@ -2256,36 +2299,72 @@ namespace WorldTuningTool
zeroFrameSkip = new Patch(new IntPtr(0x142246948), [0x31, 0xC0, 0x90, 0x90, 0x90, 0x90]);
// The game will crash when trying to switch to the FULL_RES path for SSR. It's likley because
- // it tries to access resources (shader, buffer, texture, etc.) that are not loaded.
- // Ex: MonsterHunterWorld.exe+228C4A7 - mov rdi,[rdi+00000120] # Attempted read.
- // MonsterHunterWorld.exe+259329B - lea rcx,[rdi+00000120] # Zero.
+ // it tries to access resources that are not available in the game files.
+ // Ex: MonsterHunterWorld.exe+259329B - lea rcx,[rdi+00000120] # Zero.
+ // MonsterHunterWorld.exe+228C4A7 - mov rdi,[rdi+00000120] # Attempted read.
// The code that zero's these addresses looks like a shell of where they would be loaded. My assumption
// is that it's compiled out and that this method of increasing the SSR resolution can't work.
- // Though, it may still be possible by finagling the parameters of the half res case.
/*
// Attempt to forcefully enable FULL_RES path for SSR.
- ssrRes1 = new Patch((nint)0x14228894D, [0x0F, 0x85, 0xB9, 0xAA, 0x30, 0x00]);
- ssrRes1_1 = new Patch((nint)0x14259340C, [0xC6, 0x81, 0x28, 0x02, 0x00, 0x00, 0x00, 0x90, 0x90, 0x90]);
- ssrRes2 = new Patch((nint)0x14228897D, [0x0F, 0x85, 0x99, 0xAA, 0x30, 0x00]);
- ssrRes2_1 = new Patch((nint)0x14259341C, [0xC6, 0x81, 0x30, 0x02, 0x00, 0x00, 0x00, 0x90, 0x90, 0x90]);
- ssrRes3 = new Patch((nint)0x1422889AD, [0x0F, 0x85, 0x79, 0xAA, 0x30, 0x00]);
- ssrRes3_1 = new Patch((nint)0x14259342C, [0xC6, 0x81, 0x2C, 0x02, 0x00, 0x00, 0x00, 0x90, 0x90, 0x90]);
- ssrRes4 = new Patch((nint)0x14259268C, [0x41, 0xC7, 0x86, 0x28, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xC7, 0x86, 0x2C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xC7, 0x86, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xC7, 0x86, 0x34, 0x02, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0xC7, 0x86, 0x38, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x41, 0xC6, 0x86, 0x3C, 0x02, 0x00, 0x00, 0x01]);
+ ssrFullRes1 = new Patch((nint)0x14228894D, [0x0F, 0x85, 0xB9, 0xAA, 0x30, 0x00]);
+ ssrFullRes1_1 = new Patch((nint)0x14259340C, [0xC6, 0x81, 0x28, 0x02, 0x00, 0x00, 0x00, 0x90, 0x90, 0x90]);
+ ssrFullRes2 = new Patch((nint)0x14228897D, [0x0F, 0x85, 0x99, 0xAA, 0x30, 0x00]);
+ ssrFullRes2_1 = new Patch((nint)0x14259341C, [0xC6, 0x81, 0x30, 0x02, 0x00, 0x00, 0x00, 0x90, 0x90, 0x90]);
+ ssrFullRes3 = new Patch((nint)0x1422889AD, [0x0F, 0x85, 0x79, 0xAA, 0x30, 0x00]);
+ ssrFullRes3_1 = new Patch((nint)0x14259342C, [0xC6, 0x81, 0x2C, 0x02, 0x00, 0x00, 0x00, 0x90, 0x90, 0x90]);
+ ssrFullRes4 = new Patch((nint)0x14259268C, [0x41, 0xC7, 0x86, 0x28, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xC7, 0x86, 0x2C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xC7, 0x86, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xC7, 0x86, 0x34, 0x02, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0xC7, 0x86, 0x38, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x41, 0xC6, 0x86, 0x3C, 0x02, 0x00, 0x00, 0x01]);
*/
- // None of these work either.
- /*
- // Don't scale resolution by SSR Factor.
- ssrRes10 = new Patch((nint)0x142592DEF, [0x90, 0x90, 0x90, 0x90]);
- ssrRes11 = new Patch((nint)0x142592E00, [0x90, 0x90, 0x90, 0x90]);
- // Make SSR Factor 1.0.
- ssrRes12 = new Patch((nint)0x1425926B8 + 0x7, [0x00, 0x00, 0x80, 0x3F]);
- */
- /* Double width and height (3rd and 4th parameter).
- initSSRHook = Hook.Create<initSSR>(0x1425924D5, InitSSRHook); // nint, nint, int, int
- increaseSSRMipSize1 = new Patch((nint)0x142592EBA + 0x2, [0x2]);
- increaseSSRMipSize2 = new Patch((nint)0x142592ED0 + 0x2, [0x2]);
- */
+ // SSLR resolution factor 0.5 -> 1.0 (not related to fSSLRFactor or fSSLRScale).
+ ssrRes1 = new Patch(new IntPtr(0x1425926B8) + 0x9, [0x80]);
+ ssrRes2 = new Patch(new IntPtr(0x1425934C0) + 0x8, [0x80]);
+ // Approximate mip resolution.
+ ssrShr1 = new Patch(new IntPtr(0x142592EBA) + 0x2, [0x3]); // 4 -> 3
+ ssrShr2 = new Patch(new IntPtr(0x142592ED0) + 0x2, [0x3]);
+ // Compute dispatch dimensions.
+ ssrSars1 = new Patch(new IntPtr(0x142283626) + 0x3, [0x03]); // 4 -> 3
+ ssrSars2 = new Patch(new IntPtr(0x142283633) + 0x2, [0x03]);
+ ssrSars3 = new Patch(new IntPtr(0x142283667) + 0x2, [0x03]);
+ ssrSars4 = new Patch(new IntPtr(0x14228366A) + 0x3, [0x03]);
+ ssrSars5 = new Patch(new IntPtr(0x14228366E) + 0x3, [0x03]);
+ ssrSars6 = new Patch(new IntPtr(0x142283672) + 0x3, [0x03]);
+ ssrSars7 = new Patch(new IntPtr(0x1422838D5) + 0x2, [0x03]);
+ ssrSars8 = new Patch(new IntPtr(0x1422838E7) + 0x3, [0x03]);
+ ssrSars9 = new Patch(new IntPtr(0x1422838F0) + 0x2, [0x03]);
+ ssrSars10 = new Patch(new IntPtr(0x1422838FC) + 0x2, [0x03]);
+ ssrSars11 = new Patch(new IntPtr(0x1422839B0), [0x8D, 0x0E, 0x44, 0x8D, 0x76, 0x01, 0x90]);
+
+ // RayAppendBuffer dispatch dimensions.
+ ssrSars12 = new Patch(new IntPtr(0x14228C323) + 0x3, [0x3]); // 4 -> 3
+ ssrSars13 = new Patch(new IntPtr(0x14228C32D) + 0x2, [0x3]);
+ ssrSars14 = new Patch(new IntPtr(0x14228C3F4) + 0x2, [0x7]); // 8 -> 7
+ // Enable FULL_RES path for buffer only. Not sure exactly what this does yet.
+ // Probably increases buffer size if anything. (Maybe allows higher mip0 threshold to work?)
+ ssrRes3 = new Patch(new IntPtr(0x14228C19D), [0x31, 0xC0, 0x90, 0x90, 0x90]);
+
+ // Depth mip texture resolution.
+ ssrShr3 = new Patch(new IntPtr(0x14269DE47), [0x90, 0x90]);
+ ssrShr4 = new Patch(new IntPtr(0x14269DE54), [0x90, 0x90]);
+ ssrShr5 = new Patch(new IntPtr(0x14269E07A), [0x90, 0x90]);
+ ssrShr6 = new Patch(new IntPtr(0x14269E080), [0x90, 0x90]);
+ // Approximate mip resolution.
+ ssrShr7 = new Patch(new IntPtr(0x14269DED3) + 0x2, [0x3]);
+ ssrShr8 = new Patch(new IntPtr(0x14269DEDA) + 0x3, [0x3]);
+ // Compute dispatch dimensions.
+ ssrSars15 = new Patch(new IntPtr(0x142282FD8) + 0x3, [0x3]); // 4 -> 3
+ ssrSars16 = new Patch(new IntPtr(0x142282FE5) + 0x2, [0x3]);
+ ssrSars17 = new Patch(new IntPtr(0x142283014) + 0x3, [0x3]);
+ ssrSars18 = new Patch(new IntPtr(0x142283018) + 0x3, [0x3]);
+ ssrSars19 = new Patch(new IntPtr(0x14228301C) + 0x3, [0x3]);
+ ssrSars20 = new Patch(new IntPtr(0x142283020) + 0x2, [0x3]);
+ ssrSars21 = new Patch(new IntPtr(0x14228329D) + 0x2, [0x3]);
+ ssrSars22 = new Patch(new IntPtr(0x1422832B3) + 0x3, [0x3]);
+ ssrSars23 = new Patch(new IntPtr(0x1422832BC) + 0x2, [0x3]);
+ ssrSars24 = new Patch(new IntPtr(0x1422832C8) + 0x2, [0x3]);
+
+ // Idk yet.
+ ssrSars25 = new Patch(new IntPtr(0x14228686D) + 0x3, [0x3]);
+ ssrSars26 = new Patch(new IntPtr(0x142286877) + 0x2, [0x3]);
createLight = new NativeFunction<int, nint>(0x1418A3EF0);
//createLightObject = Hook.Create<CreateLightObject>(0x1418A3EF0, CreateLightObjectHook);
@@ -2301,6 +2380,49 @@ namespace WorldTuningTool
{
Config config = getConfig();
Config.PatchConfig patches = config.Patches;
+ fullResSSLR = patches.FullResolutionSSLR;
+#if SHADER_FEATURES
+ if (fullResSSLR)
+ {
+ ssrRes1.Enable();
+ ssrRes2.Enable();
+ ssrRes3.Enable();
+ ssrShr1.Enable();
+ ssrShr2.Enable();
+ ssrShr3.Enable();
+ ssrShr4.Enable();
+ ssrShr5.Enable();
+ ssrShr6.Enable();
+ ssrShr7.Enable();
+ ssrShr8.Enable();
+ ssrSars1.Enable();
+ ssrSars2.Enable();
+ ssrSars3.Enable();
+ ssrSars4.Enable();
+ ssrSars5.Enable();
+ ssrSars6.Enable();
+ ssrSars7.Enable();
+ ssrSars8.Enable();
+ ssrSars9.Enable();
+ ssrSars10.Enable();
+ ssrSars11.Enable();
+ //ssrSars12.Enable();
+ //ssrSars13.Enable();
+ ssrSars24.Enable();
+ ssrSars14.Enable();
+ ssrSars15.Enable();
+ ssrSars16.Enable();
+ ssrSars17.Enable();
+ ssrSars18.Enable();
+ ssrSars19.Enable();
+ ssrSars20.Enable();
+ ssrSars21.Enable();
+ ssrSars22.Enable();
+ ssrSars23.Enable();
+ ssrSars25.Enable();
+ ssrSars26.Enable();
+ }
+#endif
fullResVolumeBlur = patches.FullResolutionVolumeBlur;
if (fullResVolumeBlur)
{
@@ -3332,6 +3454,18 @@ namespace WorldTuningTool
{
Config.PatchConfig patches = config.Patches;
+ if (ImGui.Checkbox("Full Resolution Screen Space Reflections (Requires Restart)", ref fullResSSLR))
+ {
+ patches.FullResolutionSSLR = fullResSSLR;
+ config.Patches = patches;
+ saveConfig(config);
+ }
+ if (ImGui.BeginItemTooltip())
+ {
+ ImGui.Text("Restart Required");
+ ImGui.EndTooltip();
+ }
+
if (ImGui.Checkbox("Volume Rendering Full Resolution Blur Pass (Requires Area Change)", ref fullResVolumeBlur))
{
if (fullResVolumeBlur)
@@ -3780,67 +3914,59 @@ namespace WorldTuningTool
public unsafe void OnCreateShader(ShaderInfo *info)
{
string hash = new string(info->DxbcHash);
- if (!shadersLoadedOnce && hash == "2e4e18fd-6ea5eeae-2de3d65c-26ab36dd")
+ if (hash == "9ff245fb-4fd555e0-04d0ef15-84609fe1")
{
- if (replaceShaderFromFile(info, $"{shaderPath}/volume_upsample1.shdr")) {
+ if (replaceShaderFromFile(info, $"{shaderPath}/fxaa_max_quality.hlsl"))
+ {
+ info->Replacement.Type = ShaderSourceType.HLSL;
+ Log.Info("FXAA shader replaced.");
+ }
+ }
+ else if (!shadersLoadedOnce && hash == "2e4e18fd-6ea5eeae-2de3d65c-26ab36dd")
+ {
+ if (replaceShaderFromFile(info, $"{shaderPath}/volume_upsample1.shdr"))
+ {
info->Replacement.Type = ShaderSourceType.Binary;
Log.Info("Volume upsample shader 1 replaced.");
}
}
else if (!shadersLoadedOnce && hash == "e2c8c13e-45bc99b2-4c3d7699-3d66188e")
{
- if (replaceShaderFromFile(info, $"{shaderPath}/volume_upsample2.shdr")) {
+ if (replaceShaderFromFile(info, $"{shaderPath}/volume_upsample2.shdr"))
+ {
info->Replacement.Type = ShaderSourceType.Binary;
Log.Info("Volume upsample shader 2 replaced.");
}
// This allows us to A/B using the volume rendering value 2 switch.
//shadersLoadedOnce = true;
}
+ /*
else if (hash == "8cf2a107-ecde214b-9939b350-7b2af1a7")
{
- if (replaceShaderFromFile(info, $"{shaderPath}/cube_only.shdr")) {
+ if (replaceShaderFromFile(info, $"{shaderPath}/cube_only.shdr"))
+ {
info->Replacement.Type = ShaderSourceType.Binary;
Log.Info("Cube Only shader replaced.");
}
}
- else if (hash == "b21dd223-98ab56ae-918264e6-eb6e8ee4")
- {
- if (replaceShaderFromFile(info, $"{shaderPath}/sslr.shdr")) {
- info->Replacement.Type = ShaderSourceType.Binary;
- Log.Info("SSLR shader replaced.");
- }
- }
- else if (hash == "9ff245fb-4fd555e0-04d0ef15-84609fe1")
- {
- if (replaceShaderFromFile(info, $"{shaderPath}/fxaa_max_quality.hlsl")) {
- info->Replacement.Type = ShaderSourceType.HLSL;
- Log.Info("FXAA shader replaced.");
- }
- }
+ */
else if (hash == "2eed1f00-e24d1b19-9d521064-17b9a586")
{
- if (replaceShaderFromFile(info, $"{shaderPath}/body_skin.shdr")) {
+ if (replaceShaderFromFile(info, $"{shaderPath}/body_skin.shdr"))
+ {
info->Replacement.Type = ShaderSourceType.Binary;
Log.Info("Body skin shader replaced.");
}
}
else if (hash == "8e5e3c09-ebe77ee4-ba1cb659-d25bc7bf")
{
- if (replaceShaderFromFile(info, $"{shaderPath}/face.shdr")) {
+ if (replaceShaderFromFile(info, $"{shaderPath}/face.shdr"))
+ {
info->Replacement.Type = ShaderSourceType.Binary;
Log.Info("Face shader replaced.");
}
}
/*
- else if (hash == "ca33bab6-2119df84-41786a69-404471cd")
- {
- if (replaceShaderFromFile(info, $"{shaderPath}/color_grading.shdr")) {
- info->Replacement.Type = ShaderSourceType.Binary;
- Log.Info("Color grading shader replaced.");
- }
- }
- */
- /*
else if (hash == "18a797dc-9458d333-59e6dff0-9790fcea")
{
if (replaceShaderFromFile(info, $"{shaderPath}/sssss.shdr")) {
@@ -3850,14 +3976,73 @@ namespace WorldTuningTool
}
*/
/*
- else if (hash == "d7e47ffe-82572c64-795c4698-341e5b91")
+ else if (hash == "ca33bab6-2119df84-41786a69-404471cd")
{
- if (replaceShaderFromFile(info, $"{shaderPath}/sslr_mips.shdr")) {
+ if (replaceShaderFromFile(info, $"{shaderPath}/color_grading.shdr")) {
info->Replacement.Type = ShaderSourceType.Binary;
- Log.Info("SSLR mips shader replaced.");
+ Log.Info("Color grading shader replaced.");
}
}
*/
+ if (fullResSSLR)
+ {
+ if (hash == "4b722c0e-8e787cd5-5eaf5e6c-09782f91")
+ {
+ if (replaceShaderFromFile(info, $"{shaderPath}/sslr_depth_mips.shdr"))
+ {
+ info->Replacement.Type = ShaderSourceType.Binary;
+ Log.Info("SSLR depth mips shader replaced.");
+ }
+ }
+ else if (hash == "5abc7a51-f182e7d6-14d2f897-6f851c0b")
+ {
+ if (replaceShaderFromFile(info, $"{shaderPath}/sslr_trace.shdr"))
+ {
+ info->Replacement.Type = ShaderSourceType.Binary;
+ Log.Info("SSLR trace shader replaced.");
+ }
+ }
+ else if (hash == "d7e47ffe-82572c64-795c4698-341e5b91")
+ {
+ if (replaceShaderFromFile(info, $"{shaderPath}/sslr_mips.shdr"))
+ {
+ info->Replacement.Type = ShaderSourceType.Binary;
+ Log.Info("SSLR mips shader replaced.");
+ }
+ }
+ else if (hash == "b21dd223-98ab56ae-918264e6-eb6e8ee4")
+ {
+ if (replaceShaderFromFile(info, $"{shaderPath}/sslr_resolve.shdr"))
+ {
+ info->Replacement.Type = ShaderSourceType.Binary;
+ Log.Info("SSLR resolve shader replaced.");
+ }
+ }
+ else if (hash == "8703f55f-6c22fba7-1ef876f1-4767379e")
+ {
+ if (replaceShaderFromFile(info, $"{shaderPath}/sslr_resolve_no_jitter.shdr"))
+ {
+ info->Replacement.Type = ShaderSourceType.Binary;
+ Log.Info("SSLR resolve no jitter shader replaced.");
+ }
+ }
+ else if (hash == "a9372f22-05154267-13f583e1-b08ffd75")
+ {
+ if (replaceShaderFromFile(info, $"{shaderPath}/sslr_resolve_no_dither.shdr"))
+ {
+ info->Replacement.Type = ShaderSourceType.Binary;
+ Log.Info("SSLR resolve no dither shader replaced.");
+ }
+ }
+ else if (hash == "77e20ce4-0538a5f1-908ba0a3-55821b0f")
+ {
+ if (replaceShaderFromFile(info, $"{shaderPath}/sslr_resolve_no_jitter_no_dither.shdr"))
+ {
+ info->Replacement.Type = ShaderSourceType.Binary;
+ Log.Info("SSLR resolve no jitter or dither shader replaced.");
+ }
+ }
+ }
}
#endif
}
diff --git a/Shaders/Original/body_skin.dxbc.xz b/Shaders/Original/body_skin.dxbc.xz
index 351aacb..351aacb 100755..100644
--- a/Shaders/Original/body_skin.dxbc.xz
+++ b/Shaders/Original/body_skin.dxbc.xz
Binary files differ
diff --git a/Shaders/Original/color_grading.dxbc.xz b/Shaders/Original/color_grading.dxbc.xz
index 7059a2c..7059a2c 100755..100644
--- a/Shaders/Original/color_grading.dxbc.xz
+++ b/Shaders/Original/color_grading.dxbc.xz
Binary files differ
diff --git a/Shaders/Original/cube_only.dxbc.xz b/Shaders/Original/cube_only.dxbc.xz
index 67f28c2..67f28c2 100755..100644
--- a/Shaders/Original/cube_only.dxbc.xz
+++ b/Shaders/Original/cube_only.dxbc.xz
Binary files differ
diff --git a/Shaders/Original/face.dxbc.xz b/Shaders/Original/face.dxbc.xz
index 546e627..546e627 100755..100644
--- a/Shaders/Original/face.dxbc.xz
+++ b/Shaders/Original/face.dxbc.xz
Binary files differ
diff --git a/Shaders/Original/fxaa_out.dxbc.xz b/Shaders/Original/fxaa_out.dxbc.xz
index 5df809e..5df809e 100755..100644
--- a/Shaders/Original/fxaa_out.dxbc.xz
+++ b/Shaders/Original/fxaa_out.dxbc.xz
Binary files differ
diff --git a/Shaders/Original/sslr_depth_mips.dxbc.xz b/Shaders/Original/sslr_depth_mips.dxbc.xz
new file mode 100644
index 0000000..a697081
--- /dev/null
+++ b/Shaders/Original/sslr_depth_mips.dxbc.xz
Binary files differ
diff --git a/Shaders/Original/sslr_mips.dxbc.xz b/Shaders/Original/sslr_mips.dxbc.xz
new file mode 100644
index 0000000..dec364c
--- /dev/null
+++ b/Shaders/Original/sslr_mips.dxbc.xz
Binary files differ
diff --git a/Shaders/Original/sslr.dxbc.xz b/Shaders/Original/sslr_resolve.dxbc.xz
index 4e69d11..4e69d11 100755..100644
--- a/Shaders/Original/sslr.dxbc.xz
+++ b/Shaders/Original/sslr_resolve.dxbc.xz
Binary files differ
diff --git a/Shaders/Original/sslr_resolve_no_dither.dxbc.xz b/Shaders/Original/sslr_resolve_no_dither.dxbc.xz
new file mode 100644
index 0000000..13c8e10
--- /dev/null
+++ b/Shaders/Original/sslr_resolve_no_dither.dxbc.xz
Binary files differ
diff --git a/Shaders/Original/sslr_resolve_no_jitter.dxbc.xz b/Shaders/Original/sslr_resolve_no_jitter.dxbc.xz
new file mode 100644
index 0000000..1a23477
--- /dev/null
+++ b/Shaders/Original/sslr_resolve_no_jitter.dxbc.xz
Binary files differ
diff --git a/Shaders/Original/sslr_resolve_no_jitter_no_dither.dxbc.xz b/Shaders/Original/sslr_resolve_no_jitter_no_dither.dxbc.xz
new file mode 100644
index 0000000..97efcbb
--- /dev/null
+++ b/Shaders/Original/sslr_resolve_no_jitter_no_dither.dxbc.xz
Binary files differ
diff --git a/Shaders/Original/sslr_trace.dxbc.xz b/Shaders/Original/sslr_trace.dxbc.xz
new file mode 100644
index 0000000..1918a6d
--- /dev/null
+++ b/Shaders/Original/sslr_trace.dxbc.xz
Binary files differ
diff --git a/Shaders/Original/sssss.dxbc.xz b/Shaders/Original/sssss.dxbc.xz
index 2f75fda..2f75fda 100755..100644
--- a/Shaders/Original/sssss.dxbc.xz
+++ b/Shaders/Original/sssss.dxbc.xz
Binary files differ
diff --git a/Shaders/Original/volume_upsample1.dxbc.xz b/Shaders/Original/volume_upsample1.dxbc.xz
index c273017..c273017 100755..100644
--- a/Shaders/Original/volume_upsample1.dxbc.xz
+++ b/Shaders/Original/volume_upsample1.dxbc.xz
Binary files differ
diff --git a/Shaders/Original/volume_upsample2.dxbc.xz b/Shaders/Original/volume_upsample2.dxbc.xz
index 95c0557..95c0557 100755..100644
--- a/Shaders/Original/volume_upsample2.dxbc.xz
+++ b/Shaders/Original/volume_upsample2.dxbc.xz
Binary files differ
diff --git a/Shaders/sslr_mips.diff b/Shaders/sslr_mips.diff
new file mode 100644
index 0000000..3576427
--- /dev/null
+++ b/Shaders/sslr_mips.diff
@@ -0,0 +1,16 @@
+--- a/sslr_mips.asm 2026-06-24 10:47:30.330434750 -0400
++++ b/sslr_mips.asm 2026-06-24 08:58:42.218378853 -0400
+@@ -62,11 +62,11 @@
+ dcl_tgsm_structured g2, 12, 4
+ dcl_thread_group 8, 8, 1
+ imad r0.x, vThreadIDInGroup.y, l(8), vThreadIDInGroup.x
+-ishl r1.xyzw, vThreadGroupID.xyxy, l(4, 4, 3, 3)
++ishl r1.xyzw, vThreadGroupID.xyxy, l(3, 3, 3, 3)
+ iadd r0.yz, r1.xxyx, cb3[0].xxyx
+ and r2.x, r0.x, l(7)
+ ushr r2.yzw, r0.xxxx, l(0, 3, 3, 3)
+-ishl r1.xy, r2.xwxx, l(1, 1, 0, 0)
++ishl r1.xy, r2.xwxx, l(0, 0, 0, 0)
+ iadd r0.yz, r0.yyzy, r1.xxyx
+ iadd r1.xy, cb3[0].zwzz, l(-1, -1, 0, 0)
+ imax r3.xy, r0.yzyy, cb3[0].xyxx
diff --git a/Shaders/sslr_resolve.diff b/Shaders/sslr_resolve.diff
new file mode 100644
index 0000000..c1128f3
--- /dev/null
+++ b/Shaders/sslr_resolve.diff
@@ -0,0 +1,29 @@
+--- a/sslr_resolve.asm 2026-06-24 10:47:30.332174347 -0400
++++ b/sslr_resolve.asm 2026-06-24 10:51:54.676142355 -0400
+@@ -202,14 +202,14 @@
+ dcl_thread_group 16, 16, 1
+ imad [precise(x)] r0.x, vThreadIDInGroup.y, l(16), vThreadIDInGroup.x
+ ishl [precise(yz)] r0.yz, vThreadGroupID.xxyx, l(0, 4, 4, 0)
+-ushr [precise(yz)] r0.yz, r0.yyzy, l(0, 1, 1, 0)
++ushr [precise(yz)] r0.yz, r0.yyzy, l(0, 0, 0, 0)
+ iadd [precise(yz)] r0.yz, r0.yyzy, vThreadIDInGroup.xxyx
+ iadd [precise(xy)] r1.xy, r0.yzyy, l(-4, -4, 0, 0)
+-ushr [precise(yz)] r0.yz, cb1[2].xxyx, l(0, 1, 1, 0)
++ushr [precise(yz)] r0.yz, cb1[2].xxyx, l(0, 0, 0, 0)
+ ige [precise(yz)] r0.yz, r1.xxyx, r0.yyzy
+ and [precise(y)] r0.y, r0.z, r0.y
+ iadd [precise(zw)] r0.zw, cb1[2].zzzw, cb1[2].xxxy
+-ushr [precise(zw)] r0.zw, r0.zzzw, l(0, 0, 1, 1)
++ushr [precise(zw)] r0.zw, r0.zzzw, l(0, 0, 0, 0)
+ ilt [precise(zw)] r0.zw, r1.xxxy, r0.zzzw
+ and [precise(z)] r0.z, r0.w, r0.z
+ and [precise(y)] r0.y, r0.z, r0.y
+@@ -413,8 +413,6 @@
+ mul [precise(xy)] r10.xy, r4.wwww, r10.xyxx
+ ftoi [precise(xy)] r10.xy, r10.xyxx
+ iadd [precise(xy)] r10.xy, r10.xyxx, vThreadIDInGroup.xyxx
+- iadd [precise(xy)] r10.xy, r10.xyxx, l(8, 8, 0, 0)
+- ushr [precise(xy)] r10.xy, r10.xyxx, l(1, 1, 0, 0)
+ ishl [precise(w)] r7.w, r10.y, l(4)
+ iadd [precise(w)] r7.w, r7.w, r10.x
+ ld_structured [precise(w)] r8.w, r7.w, l(12), g0.xxxx
diff --git a/Shaders/sslr_resolve_no_dither.diff b/Shaders/sslr_resolve_no_dither.diff
new file mode 100644
index 0000000..756d85c
--- /dev/null
+++ b/Shaders/sslr_resolve_no_dither.diff
@@ -0,0 +1,30 @@
+--- a/sslr_resolve_no_dither.asm 2026-06-24 10:47:30.333700495 -0400
++++ b/sslr_resolve_no_dither.asm 2026-06-23 16:13:51.616100220 -0400
+@@ -202,14 +202,14 @@
+ dcl_thread_group 16, 16, 1
+ imad [precise(x)] r0.x, vThreadIDInGroup.y, l(16), vThreadIDInGroup.x
+ ishl [precise(yz)] r0.yz, vThreadGroupID.xxyx, l(0, 4, 4, 0)
+-ushr [precise(yz)] r0.yz, r0.yyzy, l(0, 1, 1, 0)
++ushr [precise(yz)] r0.yz, r0.yyzy, l(0, 0, 0, 0)
+ iadd [precise(yz)] r0.yz, r0.yyzy, vThreadIDInGroup.xxyx
+ iadd [precise(xy)] r1.xy, r0.yzyy, l(-4, -4, 0, 0)
+-ushr [precise(yz)] r0.yz, cb1[2].xxyx, l(0, 1, 1, 0)
++ushr [precise(yz)] r0.yz, cb1[2].xxyx, l(0, 0, 0, 0)
+ ige [precise(yz)] r0.yz, r1.xxyx, r0.yyzy
+ and [precise(y)] r0.y, r0.z, r0.y
+ iadd [precise(zw)] r0.zw, cb1[2].zzzw, cb1[2].xxxy
+-ushr [precise(zw)] r0.zw, r0.zzzw, l(0, 0, 1, 1)
++ushr [precise(zw)] r0.zw, r0.zzzw, l(0, 0, 0, 0)
+ ilt [precise(zw)] r0.zw, r1.xxxy, r0.zzzw
+ and [precise(z)] r0.z, r0.w, r0.z
+ and [precise(y)] r0.y, r0.z, r0.y
+@@ -361,8 +361,7 @@
+ mul r1.w, r1.w, cb3[2].w
+ mul [precise(w)] r2.w, r2.x, r2.x
+ mul [precise(w)] r2.w, r2.w, l(0.500000)
+- iadd [precise(xy)] r7.xy, vThreadIDInGroup.xyxx, l(8, 8, 0, 0)
+- ushr [precise(xy)] r7.xy, r7.xyxx, l(1, 1, 0, 0)
++ mov [precise(xy)] r7.xy, vThreadIDInGroup.xyxx
+ imad [precise(w)] r3.w, r7.y, l(16), r7.x
+ ld_structured [precise] r7.xyzw, r3.w, l(0), g0.xyzw
+ and [precise(w)] r3.w, r7.w, l(0x80000000)
diff --git a/Shaders/sslr_resolve_no_jitter.diff b/Shaders/sslr_resolve_no_jitter.diff
new file mode 100644
index 0000000..e3e8f9f
--- /dev/null
+++ b/Shaders/sslr_resolve_no_jitter.diff
@@ -0,0 +1,29 @@
+--- a/sslr_resolve_no_jitter.asm 2026-06-24 10:47:30.335375123 -0400
++++ b/sslr_resolve_no_jitter.asm 2026-06-23 16:14:11.607385425 -0400
+@@ -202,14 +202,14 @@
+ dcl_thread_group 16, 16, 1
+ imad [precise(x)] r0.x, vThreadIDInGroup.y, l(16), vThreadIDInGroup.x
+ ishl [precise(yz)] r0.yz, vThreadGroupID.xxyx, l(0, 4, 4, 0)
+-ushr [precise(yz)] r0.yz, r0.yyzy, l(0, 1, 1, 0)
++ushr [precise(yz)] r0.yz, r0.yyzy, l(0, 0, 0, 0)
+ iadd [precise(yz)] r0.yz, r0.yyzy, vThreadIDInGroup.xxyx
+ iadd [precise(xy)] r1.xy, r0.yzyy, l(-4, -4, 0, 0)
+-ushr [precise(yz)] r0.yz, cb1[2].xxyx, l(0, 1, 1, 0)
++ushr [precise(yz)] r0.yz, cb1[2].xxyx, l(0, 0, 0, 0)
+ ige [precise(yz)] r0.yz, r1.xxyx, r0.yyzy
+ and [precise(y)] r0.y, r0.z, r0.y
+ iadd [precise(zw)] r0.zw, cb1[2].zzzw, cb1[2].xxxy
+-ushr [precise(zw)] r0.zw, r0.zzzw, l(0, 0, 1, 1)
++ushr [precise(zw)] r0.zw, r0.zzzw, l(0, 0, 0, 0)
+ ilt [precise(zw)] r0.zw, r1.xxxy, r0.zzzw
+ and [precise(z)] r0.z, r0.w, r0.z
+ and [precise(y)] r0.y, r0.z, r0.y
+@@ -402,8 +402,6 @@
+ mul [precise(xy)] r10.xy, r4.wwww, r10.xyxx
+ ftoi [precise(xy)] r10.xy, r10.xyxx
+ iadd [precise(xy)] r10.xy, r10.xyxx, vThreadIDInGroup.xyxx
+- iadd [precise(xy)] r10.xy, r10.xyxx, l(8, 8, 0, 0)
+- ushr [precise(xy)] r10.xy, r10.xyxx, l(1, 1, 0, 0)
+ ishl [precise(w)] r7.w, r10.y, l(4)
+ iadd [precise(w)] r7.w, r7.w, r10.x
+ ld_structured [precise(w)] r8.w, r7.w, l(12), g0.xxxx
diff --git a/Shaders/sslr_resolve_no_jitter_no_dither.diff b/Shaders/sslr_resolve_no_jitter_no_dither.diff
new file mode 100644
index 0000000..ebcdb47
--- /dev/null
+++ b/Shaders/sslr_resolve_no_jitter_no_dither.diff
@@ -0,0 +1,30 @@
+--- a/sslr_resolve_no_jitter_no_dither.asm 2026-06-24 10:47:30.336853482 -0400
++++ b/sslr_resolve_no_jitter_no_dither.asm 2026-06-23 16:16:47.490979883 -0400
+@@ -171,14 +171,14 @@
+ dcl_thread_group 16, 16, 1
+ imad [precise(x)] r0.x, vThreadIDInGroup.y, l(16), vThreadIDInGroup.x
+ ishl [precise(yz)] r0.yz, vThreadGroupID.xxyx, l(0, 4, 4, 0)
+-ushr [precise(yz)] r0.yz, r0.yyzy, l(0, 1, 1, 0)
++ushr [precise(yz)] r0.yz, r0.yyzy, l(0, 0, 0, 0)
+ iadd [precise(yz)] r0.yz, r0.yyzy, vThreadIDInGroup.xxyx
+ iadd [precise(xy)] r1.xy, r0.yzyy, l(-4, -4, 0, 0)
+-ushr [precise(yz)] r0.yz, cb1[2].xxyx, l(0, 1, 1, 0)
++ushr [precise(yz)] r0.yz, cb1[2].xxyx, l(0, 0, 0, 0)
+ ige [precise(yz)] r0.yz, r1.xxyx, r0.yyzy
+ and [precise(y)] r0.y, r0.z, r0.y
+ iadd [precise(zw)] r0.zw, cb1[2].zzzw, cb1[2].xxxy
+-ushr [precise(zw)] r0.zw, r0.zzzw, l(0, 0, 1, 1)
++ushr [precise(zw)] r0.zw, r0.zzzw, l(0, 0, 0, 0)
+ ilt [precise(zw)] r0.zw, r1.xxxy, r0.zzzw
+ and [precise(z)] r0.z, r0.w, r0.z
+ and [precise(y)] r0.y, r0.z, r0.y
+@@ -319,8 +319,7 @@
+ mul r1.w, r1.w, cb3[2].w
+ mul [precise(w)] r2.w, r2.x, r2.x
+ mul [precise(w)] r2.w, r2.w, l(0.500000)
+- iadd [precise(xy)] r7.xy, vThreadIDInGroup.xyxx, l(8, 8, 0, 0)
+- ushr [precise(xy)] r7.xy, r7.xyxx, l(1, 1, 0, 0)
++ mov [precise(xy)] r7.xy, vThreadIDInGroup.xyxx
+ imad [precise(w)] r3.w, r7.y, l(16), r7.x
+ ld_structured [precise] r7.xyzw, r3.w, l(0), g0.xyzw
+ and [precise(w)] r3.w, r7.w, l(0x80000000)
diff --git a/Shaders/sslr_trace.diff b/Shaders/sslr_trace.diff
new file mode 100644
index 0000000..aa8b41c
--- /dev/null
+++ b/Shaders/sslr_trace.diff
@@ -0,0 +1,11 @@
+--- a/sslr_trace.asm 2026-06-24 10:47:30.337935140 -0400
++++ b/sslr_trace.asm 2026-06-23 20:52:23.763672177 -0400
+@@ -166,7 +166,7 @@
+ add r2.xyzw, r2.xyzw, cb0[23].xyzw
+ rcp r0.z, r2.w
+ mul r3.xyz, r0.zzzz, r2.xyzx
+- ishl r4.xy, r0.xyxx, l(1, 1, 0, 0)
++ ishl r4.xy, r0.xyxx, l(0, 0, 0, 0)
+ mov r4.zw, l(0,0,0,0)
+ ld_indexable(texture2d)(float,float,float,float) r4.xy, r4.xyzw, t1.xyzw
+ mad r4.xy, r4.xyxx, l(2.000000, 2.000000, 0.000000, 0.000000), l(-1.000000, -1.000000, 0.000000, 0.000000)