From 4f31c9e16b58eeb1e914d58a4e92b8adc6529450 Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Mon, 6 Apr 2026 15:27:06 -0400 Subject: Cleanup volume upsample stuff Signed-off-by: Andrew Opalach --- Plugin.cs | 26 ++++- Shaders/Original/volume_upsample.dxbc.xz | Bin 1700 -> 0 bytes Shaders/Original/volume_upsample1.dxbc.xz | Bin 0 -> 1700 bytes Shaders/volume_upsample.diff | 22 ---- Shaders/volume_upsample1.diff | 19 +++ Shaders/volume_upsample2.diff | 185 ++---------------------------- 6 files changed, 50 insertions(+), 202 deletions(-) delete mode 100755 Shaders/Original/volume_upsample.dxbc.xz create mode 100755 Shaders/Original/volume_upsample1.dxbc.xz delete mode 100644 Shaders/volume_upsample.diff create mode 100644 Shaders/volume_upsample1.diff diff --git a/Plugin.cs b/Plugin.cs index a7d4394..30d9a88 100755 --- a/Plugin.cs +++ b/Plugin.cs @@ -1,4 +1,5 @@ //#define ENABLE_ASSERTS +//#define ADDR_ASSERTS //#define SHADER_FEATURES using System.Numerics; @@ -1069,6 +1070,8 @@ namespace WorldTuningTool new Parameter("LOD Length Platform Bias[2]", 0x22C + (4 * 2), ParameterType.FLOAT, false), new Parameter("LOD Pixel Size Platform Bias[2]", 0x244 + (4 * 2), ParameterType.FLOAT, false), new Parameter("Fake Light Intensity", 0xEC40, ParameterType.FLOAT, false), + // MonsterHunterWorld.exe+1B18711 - mov [rbx+0000EC44],3F800000 (Other unknown reference). + new Parameter("Fake Light Intensity (Gameplay)", new IntPtr(0x141B1A19F) + 0x6, ParameterType.PATCH_FLOAT, false), new Parameter("Fake Light Blend", new IntPtr(0x141CDE0CE) + 0x6, ParameterType.PATCH_FLOAT, false), new Parameter("Contact Shadows Enabled", 0xB4EC, ParameterType.BOOL, false), new Parameter("Force Disable Contact Shadows", 0xB4ED, ParameterType.BOOL, false), @@ -1597,6 +1600,10 @@ namespace WorldTuningTool 0xB8, 0x40, 0x15, 0x00, 0x00, 0xEB, 0x21 // This case is used for Low, Medium and High in-game. ]); + // The volume blur filter is created at a different place in the code and happens at a different + // time (area change/createLightingObject() vs change of Volume Quality setting). It's also rendered + // in a seperate pass that happens after the initial volume rendering. So keep that in mind if inspecting + // a frame in renderdoc. volumeSars1 = new Patch(new IntPtr(0x1424D0159), [0x90, 0x90]); volumeSars2 = new Patch(new IntPtr(0x1424D01A0), [0x90, 0x90]); volumeSars3 = new Patch(new IntPtr(0x1424D01C6), [0x90, 0x90]); @@ -1606,13 +1613,28 @@ namespace WorldTuningTool volumeSars7 = new Patch(new IntPtr(0x1424D02C6), [0x90, 0x90]); volumeSars8 = new Patch(new IntPtr(0x1424D0321), [0x90, 0x90]); volumeSars9 = new Patch(new IntPtr(0x1424D034A), [0x90, 0x90]); + /* As far as I can tell this is limited by buffers created cpu-side, seems like it + * would be an extremely hard change. + froxelRes1 = new Patch(new IntPtr(0x142384F15) + 0x1, [0x02]); // 4 -> 2 + froxelRes2 = new Patch(new IntPtr(0x142389711) + 0x1, [0x02]); // 4 -> 2 + froxelRes3 = new Patch(new IntPtr(0x142389878) + 0x1, [0x02]); // 4 -> 2 + froxelRes4 = new Patch(new IntPtr(0x14238989E) + 0x1, [0x02]); // 4 -> 2 + froxelRes5 = new Patch(new IntPtr(0x1423898D8) + 0x1, [0x02]); // 4 -> 2 + froxelRes6 = new Patch(new IntPtr(0x14238992B) + 0x1, [0x02]); // 4 -> 2 + froxelRes7 = new Patch(new IntPtr(0x14238FED1) + 0x4, [0x7B, 0xFF, 0xAB, 0x00]); // 0.25 -> 0.50 + froxelRes8 = new Patch(new IntPtr(0x14239009C) + 0x4, [0xB0, 0xFD, 0xAB, 0X00]); // 0.25 -> 0.50 + */ + /* Would require a complicated shader edit to maybe work. Similar to SSLR. + checkerRes1 = new Patch(new IntPtr(0x14238580D) + 0x4, [0x43]); // 0.5 -> 1.0 + checkerRes2 = new Patch(new IntPtr(0x14238FFC3) + 0x4, [0x8D]); // 0.5 -> 1.0 + */ value2ForVolumeQuality = new Patch(new IntPtr(0x142389652), [0xB8, 0x02, 0x00, 0x00, 0x00, 0x90]); // Gameplay. addr = PatternScanner.FindFirst(Pattern.FromString("80 BB 34 EC 00 00 00 88 8B 31 EC 00 00 C6 83 30 EC 00 00 00 74 1C C6 83 34 EC 00 00 00 48 8B 0D 68 4B 4F 03 80 B9 58 02 00 00 00 75 05 E8 5A F5 01 00 48 8B CB E8 E2 05 00 00 83 BB DC EB 00 00 06 74 0A C7 83 DC EB 00 00 06 00 00 00")); #if ADDR_ASSERTS - ssert(addr == 0x141B1A0B4); + Assert(addr == 0x141B1A0B4); #endif defaultViewModeLODLimit = new Patch(addr + 0x40, [0x07, 0x74, 0x0A, 0xC7, 0x83, 0xDC, 0xEB, 0x00, 0x00, 0x07]); @@ -2636,7 +2658,7 @@ namespace WorldTuningTool string hash = new string(info->DxbcHash); if (!shadersLoadedOnce && hash == "2e4e18fd-6ea5eeae-2de3d65c-26ab36dd") { - if (replaceShaderFromFile(info, $"{shaderPath}/volume_upsample.shdr")) { + if (replaceShaderFromFile(info, $"{shaderPath}/volume_upsample1.shdr")) { info->Replacement.Type = ShaderSourceType.BINARY; Log.Info("Volume upsample shader 1 replaced."); } diff --git a/Shaders/Original/volume_upsample.dxbc.xz b/Shaders/Original/volume_upsample.dxbc.xz deleted file mode 100755 index c273017..0000000 Binary files a/Shaders/Original/volume_upsample.dxbc.xz and /dev/null differ diff --git a/Shaders/Original/volume_upsample1.dxbc.xz b/Shaders/Original/volume_upsample1.dxbc.xz new file mode 100755 index 0000000..c273017 Binary files /dev/null and b/Shaders/Original/volume_upsample1.dxbc.xz differ diff --git a/Shaders/volume_upsample.diff b/Shaders/volume_upsample.diff deleted file mode 100644 index 13c9633..0000000 --- a/Shaders/volume_upsample.diff +++ /dev/null @@ -1,22 +0,0 @@ ---- a/volume_upsample.asm 2026-03-16 15:19:54.032009332 -0400 -+++ b/volume_upsample.asm 2026-03-16 15:19:36.341817879 -0400 -@@ -235,16 +155,9 @@ - ld_indexable(texture2d)(float,float,float,float) r1.yzw, r2.xyzz, t3.wxyz - ld_indexable(texture2d)(float,float,float,float) r3.xyz, r2.xyzz, t4.xyzw - else -- if_nz r1.x -- mul r0.xy, r0.xyxx, cb3[2].xyxx -- mul r0.xy, r0.xyxx, cb1[4].zzzz -- sample_l_indexable(texture2d)(float,float,float,float) r1.yzw, r0.xyxx, t0.wxyz, s0, l(0.000000) -- sample_l_indexable(texture2d)(float,float,float,float) r3.xyz, r0.xyxx, t1.xyzw, s0, l(0.000000) -- else -- mov r2.w, l(0) -- ld_indexable(texture2d)(float,float,float,float) r1.yzw, r2.xyww, t0.wxyz -- ld_indexable(texture2d)(float,float,float,float) r3.xyz, r2.xyww, t1.xyzw -- endif -+ mov r2.w, l(0) -+ ld_indexable(texture2d)(float,float,float,float) r1.yzw, r2.xyww, t0.wxyz -+ ld_indexable(texture2d)(float,float,float,float) r3.xyz, r2.xyww, t1.xyzw - endif - store_uav_typed u0.xyzw, vThreadID.xyyy, r0.wwww - store_uav_typed u1.xyzw, vThreadID.xyyy, r1.yzwy diff --git a/Shaders/volume_upsample1.diff b/Shaders/volume_upsample1.diff new file mode 100644 index 0000000..190a6ec --- /dev/null +++ b/Shaders/volume_upsample1.diff @@ -0,0 +1,19 @@ +--- a/volume_upsample1.asm 2026-04-06 14:22:44.767716700 -0400 ++++ b/volume_upsample1.asm 2026-04-06 14:10:12.184989600 -0400 +@@ -235,16 +235,9 @@ + ld_indexable(texture2d)(float,float,float,float) r1.yzw, r2.xyzz, t3.wxyz + ld_indexable(texture2d)(float,float,float,float) r3.xyz, r2.xyzz, t4.xyzw + else +- if_nz r1.x +- mul r0.xy, r0.xyxx, cb3[2].xyxx +- mul r0.xy, r0.xyxx, cb1[4].zzzz +- sample_l_indexable(texture2d)(float,float,float,float) r1.yzw, r0.xyxx, t0.wxyz, s0, l(0.000000) +- sample_l_indexable(texture2d)(float,float,float,float) r3.xyz, r0.xyxx, t1.xyzw, s0, l(0.000000) +- else + mov r2.w, l(0) + ld_indexable(texture2d)(float,float,float,float) r1.yzw, r2.xyww, t0.wxyz + ld_indexable(texture2d)(float,float,float,float) r3.xyz, r2.xyww, t1.xyzw +- endif + endif + store_uav_typed u0.xyzw, vThreadID.xyyy, r0.wwww + store_uav_typed u1.xyzw, vThreadID.xyyy, r1.yzwy diff --git a/Shaders/volume_upsample2.diff b/Shaders/volume_upsample2.diff index 0887f10..41928bb 100644 --- a/Shaders/volume_upsample2.diff +++ b/Shaders/volume_upsample2.diff @@ -1,10 +1,9 @@ ---- a/volume_upsample2.asm 2026-03-16 15:19:50.820204181 -0400 -+++ b/volume_upsample2.asm 2026-03-16 15:19:31.707007465 -0400 -@@ -254,103 +182,92 @@ - else +--- a/volume_upsample2.asm 2026-04-06 14:22:43.005055900 -0400 ++++ b/volume_upsample2.asm 2026-04-06 14:10:43.900118100 -0400 +@@ -255,14 +255,9 @@ mov r0.w, l(0) endif --if_nz r0.w + if_nz r0.w - utof r1.xy, r2.xyxx - mul r1.xy, r1.xyxx, cb3[2].zwzz - mul r1.xy, r1.xyxx, cb1[4].zzzz @@ -13,179 +12,9 @@ - min r1.xy, r1.zwzz, r1.xyxx - sample_l_indexable(texture2d)(float,float,float,float) r3.xyz, r1.xyxx, t1.xyzw, s0, l(0.000000) - sample_l_indexable(texture2d)(float,float,float,float) r1.xyz, r1.xyxx, t2.xyzw, s0, l(0.000000) -+if_nz r0.z -+ iadd r0.xy, -r0.xyxx, r2.yxyy -+ mov r4.xy, vThreadID.xyxx -+ mov r4.zw, l(0,0,0,0) -+ ld_indexable(texture2d)(float,float,float,float) r0.z, r4.xyzw, t0.yzxw -+ not r4.xy, r0.xyxx -+ imad r0.y, r4.x, l(-9), r0.y -+ imad r0.w, r4.x, l(-9), -r4.y -+ ishl r0.w, r0.w, l(8) -+ or r0.w, r0.w, r0.y -+ imad r0.x, r0.x, l(9), -r4.y -+ ishl r0.xy, r0.xyxx, l(16, 24, 0, 0) -+ or r0.x, r0.x, r0.w -+ or r0.x, r0.y, r0.x -+ bfi r0.y, l(1), l(1), vThreadIDInGroup.y, l(0) -+ bfi r0.y, l(1), l(0), vThreadIDInGroup.x, r0.y -+ and r0.w, r0.x, l(255) -+ ld_structured r1.w, r0.w, l(0), g0.xxxx -+ add r1.w, r0.z, -r1.w -+ add r1.w, |r1.w|, l(1.192092896E-07) -+ iadd r3.w, -r1.w, l(0x7ef312ac) -+ mad r4.x, -r3.w, r1.w, l(2.000000) -+ mul r3.w, r3.w, r4.x -+ mad r1.w, -r3.w, r1.w, l(2.000000) -+ mul r1.w, r1.w, r3.w -+ mul r3.w, r1.w, icb[r0.y + 0].x -+ ld_structured r4.xyz, r0.w, l(0), g1.xyzx -+ ld_structured r5.xyz, r0.w, l(0), g2.xyzx -+ mad r0.w, r1.w, icb[r0.y + 0].x, l(1.192092896E-07) -+ ubfe r6.xy, l(8, 8, 0, 0), l(8, 16, 0, 0), r0.xxxx -+ ld_structured r1.w, r6.x, l(0), g0.xxxx -+ add r1.w, r0.z, -r1.w -+ add r1.w, |r1.w|, l(1.192092896E-07) -+ iadd r4.w, -r1.w, l(0x7ef312ac) -+ mad r5.w, -r4.w, r1.w, l(2.000000) -+ mul r4.w, r4.w, r5.w -+ mad r1.w, -r4.w, r1.w, l(2.000000) -+ mul r1.w, r1.w, r4.w -+ mul r4.w, r1.w, icb[r0.y + 0].y -+ ld_structured r7.xyz, r6.x, l(0), g1.xyzx -+ mul r7.xyz, r4.wwww, r7.xyzx -+ mad r4.xyz, r4.xyzx, r3.wwww, r7.xyzx -+ ld_structured r6.xzw, r6.x, l(0), g2.xxyz -+ mul r6.xzw, r4.wwww, r6.xxzw -+ mad r5.xyz, r5.xyzx, r3.wwww, r6.xzwx -+ mad r0.w, r1.w, icb[r0.y + 0].y, r0.w -+ ld_structured r1.w, r6.y, l(0), g0.xxxx -+ add r1.w, r0.z, -r1.w -+ add r1.w, |r1.w|, l(1.192092896E-07) -+ iadd r3.w, -r1.w, l(0x7ef312ac) -+ mad r4.w, -r3.w, r1.w, l(2.000000) -+ mul r3.w, r3.w, r4.w -+ mad r1.w, -r3.w, r1.w, l(2.000000) -+ mul r1.w, r1.w, r3.w -+ mul r3.w, r1.w, icb[r0.y + 0].z -+ ld_structured r6.xzw, r6.y, l(0), g1.xxyz -+ mad r4.xyz, r6.xzwx, r3.wwww, r4.xyzx -+ ld_structured r6.xyz, r6.y, l(0), g2.xyzx -+ mad r5.xyz, r6.xyzx, r3.wwww, r5.xyzx -+ mad r0.w, r1.w, icb[r0.y + 0].z, r0.w -+ ushr r0.x, r0.x, l(24) -+ ld_structured r1.w, r0.x, l(0), g0.xxxx -+ add r0.z, r0.z, -r1.w -+ add r0.z, |r0.z|, l(1.192092896E-07) -+ iadd r1.w, -r0.z, l(0x7ef312ac) -+ mad r3.w, -r1.w, r0.z, l(2.000000) -+ mul r1.w, r1.w, r3.w -+ mad r0.z, -r1.w, r0.z, l(2.000000) -+ mul r0.z, r0.z, r1.w -+ mul r1.w, r0.z, icb[r0.y + 0].w -+ ld_structured r6.xyz, r0.x, l(0), g1.xyzx -+ mad r4.xyz, r6.xyzx, r1.wwww, r4.xyzx -+ ld_structured r6.xyz, r0.x, l(0), g2.xyzx -+ mad r5.xyz, r6.xyzx, r1.wwww, r5.xyzx -+ mad r0.x, r0.z, icb[r0.y + 0].w, r0.w -+ iadd r0.y, -r0.x, l(0x7ef312ac) -+ mad r0.z, -r0.y, r0.x, l(2.000000) -+ mul r0.y, r0.z, r0.y -+ mad r0.x, -r0.y, r0.x, l(2.000000) -+ mul r0.x, r0.x, r0.y -+ mul r3.xyz, r0.xxxx, r4.xyzx -+ mul r1.xyz, r0.xxxx, r5.xyzx - else -- if_nz r0.z -- iadd r0.xy, -r0.xyxx, r2.yxyy -- mov r4.xy, vThreadID.xyxx -- mov r4.zw, l(0,0,0,0) -- ld_indexable(texture2d)(float,float,float,float) r0.z, r4.xyzw, t0.yzxw -- not r4.xy, r0.xyxx -- imad r0.y, r4.x, l(-9), r0.y -- imad r0.w, r4.x, l(-9), -r4.y -- ishl r0.w, r0.w, l(8) -- or r0.w, r0.w, r0.y -- imad r0.x, r0.x, l(9), -r4.y -- ishl r0.xy, r0.xyxx, l(16, 24, 0, 0) -- or r0.x, r0.x, r0.w -- or r0.x, r0.y, r0.x -- bfi r0.y, l(1), l(1), vThreadIDInGroup.y, l(0) -- bfi r0.y, l(1), l(0), vThreadIDInGroup.x, r0.y -- and r0.w, r0.x, l(255) -- ld_structured r1.w, r0.w, l(0), g0.xxxx -- add r1.w, r0.z, -r1.w -- add r1.w, |r1.w|, l(1.192092896E-07) -- iadd r3.w, -r1.w, l(0x7ef312ac) -- mad r4.x, -r3.w, r1.w, l(2.000000) -- mul r3.w, r3.w, r4.x -- mad r1.w, -r3.w, r1.w, l(2.000000) -- mul r1.w, r1.w, r3.w -- mul r3.w, r1.w, icb[r0.y + 0].x -- ld_structured r4.xyz, r0.w, l(0), g1.xyzx -- ld_structured r5.xyz, r0.w, l(0), g2.xyzx -- mad r0.w, r1.w, icb[r0.y + 0].x, l(1.192092896E-07) -- ubfe r6.xy, l(8, 8, 0, 0), l(8, 16, 0, 0), r0.xxxx -- ld_structured r1.w, r6.x, l(0), g0.xxxx -- add r1.w, r0.z, -r1.w -- add r1.w, |r1.w|, l(1.192092896E-07) -- iadd r4.w, -r1.w, l(0x7ef312ac) -- mad r5.w, -r4.w, r1.w, l(2.000000) -- mul r4.w, r4.w, r5.w -- mad r1.w, -r4.w, r1.w, l(2.000000) -- mul r1.w, r1.w, r4.w -- mul r4.w, r1.w, icb[r0.y + 0].y -- ld_structured r7.xyz, r6.x, l(0), g1.xyzx -- mul r7.xyz, r4.wwww, r7.xyzx -- mad r4.xyz, r4.xyzx, r3.wwww, r7.xyzx -- ld_structured r6.xzw, r6.x, l(0), g2.xxyz -- mul r6.xzw, r4.wwww, r6.xxzw -- mad r5.xyz, r5.xyzx, r3.wwww, r6.xzwx -- mad r0.w, r1.w, icb[r0.y + 0].y, r0.w -- ld_structured r1.w, r6.y, l(0), g0.xxxx -- add r1.w, r0.z, -r1.w -- add r1.w, |r1.w|, l(1.192092896E-07) -- iadd r3.w, -r1.w, l(0x7ef312ac) -- mad r4.w, -r3.w, r1.w, l(2.000000) -- mul r3.w, r3.w, r4.w -- mad r1.w, -r3.w, r1.w, l(2.000000) -- mul r1.w, r1.w, r3.w -- mul r3.w, r1.w, icb[r0.y + 0].z -- ld_structured r6.xzw, r6.y, l(0), g1.xxyz -- mad r4.xyz, r6.xzwx, r3.wwww, r4.xyzx -- ld_structured r6.xyz, r6.y, l(0), g2.xyzx -- mad r5.xyz, r6.xyzx, r3.wwww, r5.xyzx -- mad r0.w, r1.w, icb[r0.y + 0].z, r0.w -- ushr r0.x, r0.x, l(24) -- ld_structured r1.w, r0.x, l(0), g0.xxxx -- add r0.z, r0.z, -r1.w -- add r0.z, |r0.z|, l(1.192092896E-07) -- iadd r1.w, -r0.z, l(0x7ef312ac) -- mad r3.w, -r1.w, r0.z, l(2.000000) -- mul r1.w, r1.w, r3.w -- mad r0.z, -r1.w, r0.z, l(2.000000) -- mul r0.z, r0.z, r1.w -- mul r1.w, r0.z, icb[r0.y + 0].w -- ld_structured r6.xyz, r0.x, l(0), g1.xyzx -- mad r4.xyz, r6.xyzx, r1.wwww, r4.xyzx -- ld_structured r6.xyz, r0.x, l(0), g2.xyzx -- mad r5.xyz, r6.xyzx, r1.wwww, r5.xyzx -- mad r0.x, r0.z, icb[r0.y + 0].w, r0.w -- iadd r0.y, -r0.x, l(0x7ef312ac) -- mad r0.z, -r0.y, r0.x, l(2.000000) -- mul r0.y, r0.z, r0.y -- mad r0.x, -r0.y, r0.x, l(2.000000) -- mul r0.x, r0.x, r0.y -- mul r3.xyz, r0.xxxx, r4.xyzx -- mul r1.xyz, r0.xxxx, r5.xyzx -- else -- mov r2.zw, l(0,0,0,0) -- ld_indexable(texture2d)(float,float,float,float) r3.xyz, r2.xyww, t1.xyzw -- ld_indexable(texture2d)(float,float,float,float) r1.xyz, r2.xyzw, t2.xyzw -- endif + mov r2.zw, l(0,0,0,0) + ld_indexable(texture2d)(float,float,float,float) r3.xyz, r2.xyww, t1.xyzw + ld_indexable(texture2d)(float,float,float,float) r1.xyz, r2.xyzw, t2.xyzw - endif - store_uav_typed u1.xyzw, vThreadID.xyyy, r1.xyzz - store_uav_typed u0.xyzw, vThreadID.xyyy, r3.xyzz + else + if_nz r0.z + iadd r0.xy, -r0.xyxx, r2.yxyy -- cgit v1.2.3-101-g0448