From 52e2800fb594714091c56e46ee845fcd3b0d1eb4 Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Fri, 4 Mar 2016 17:53:50 +0100 Subject: [PATCH 1/2] rsx: Reset fog mode/param to linear/1.; Fix After Burner Climax fog --- rpcs3/Emu/RSX/RSXThread.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index aa3a338490..b595b45a95 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -768,7 +768,10 @@ namespace rsx method_registers[NV4097_SET_LINE_WIDTH] = 1 << 3; - method_registers[NV4097_SET_FOG_MODE] = 0x0800; // rsx::fog_mode::exponential; + // These defaults were found using After Burner Climax (which never set fog mode despite using fog input) + method_registers[NV4097_SET_FOG_MODE] = 0x2601; // rsx::fog_mode::linear; + (f32&)method_registers[NV4097_SET_FOG_PARAMS] = 1.; + (f32&)method_registers[NV4097_SET_FOG_PARAMS + 1] = 1.; method_registers[NV4097_SET_DEPTH_FUNC] = CELL_GCM_LESS; method_registers[NV4097_SET_DEPTH_MASK] = CELL_GCM_TRUE; From 1dcc6858b48f913a27a12043d49dbea67154cebb Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Fri, 4 Mar 2016 17:51:24 +0100 Subject: [PATCH 2/2] d3d12/gl: Separate fog distance and fog frag in fogc input. --- .../Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp | 12 ++++++------ rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp index e98655200c..0876e961fe 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp @@ -152,22 +152,22 @@ namespace switch (mode) { case rsx::fog_mode::linear: - OS << " float4 fogc = fog_param1 * In.fogc + (fog_param0 - 1.);\n"; + OS << " float4 fogc = float4(fog_param1 * In.fogc + (fog_param0 - 1.), fog_param1 * In.fogc + (fog_param0 - 1.), 0., 0.);\n"; return; case rsx::fog_mode::exponential: - OS << " float4 fogc = exp(11.084 * (fog_param1 * In.fogc + fog_param0 - 1.5));\n"; + OS << " float4 fogc = float4(11.084 * (fog_param1 * In.fogc + fog_param0 - 1.5), exp(11.084 * (fog_param1 * In.fogc + fog_param0 - 1.5)), 0., 0.);\n"; return; case rsx::fog_mode::exponential2: - OS << " float4 fogc = exp(-pow(4.709 * (fog_param1 * In.fogc + fog_param0 - 1.5)), 2.);\n"; + OS << " float4 fogc = float4(4.709 * (fog_param1 * In.fogc + fog_param0 - 1.5), exp(-pow(4.709 * (fog_param1 * In.fogc + fog_param0 - 1.5)), 2.)), 0., 0.);\n"; return; case rsx::fog_mode::linear_abs: - OS << " float4 fogc = fog_param1 * abs(In.fogc) + (fog_param0 - 1.);\n"; + OS << " float4 fogc = float4(fog_param1 * abs(In.fogc) + (fog_param0 - 1.), fog_param1 * abs(In.fogc) + (fog_param0 - 1.), 0., 0.);\n"; return; case rsx::fog_mode::exponential_abs: - OS << " float4 fogc = exp(11.084 * (fog_param1 * abs(In.fogc) + fog_param0 - 1.5));\n"; + OS << " float4 fogc = float4(11.084 * (fog_param1 * abs(In.fogc) + fog_param0 - 1.5), exp(11.084 * (fog_param1 * abs(In.fogc) + fog_param0 - 1.5)), 0., 0.);\n"; return; case rsx::fog_mode::exponential2_abs: - OS << " float4 fogc = exp(-pow(4.709 * (fog_param1 * abs(In.fogc) + fog_param0 - 1.5)), 2.);\n"; + OS << " float4 fogc = float4(4.709 * (fog_param1 * abs(In.fogc) + fog_param0 - 1.5), exp(-pow(4.709 * (fog_param1 * abs(In.fogc) + fog_param0 - 1.5)), 2.)), 0., 0.);\n"; return; } } diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index b97d0cdac7..da1427c91a 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -122,22 +122,22 @@ namespace switch (mode) { case rsx::fog_mode::linear: - OS << " vec4 fogc = fog_param1 * fog_c + (fog_param0 - 1.);\n"; + OS << " vec4 fogc = vec4(fog_param1 * fog_c.x + (fog_param0 - 1.), fog_param1 * fog_c.x + (fog_param0 - 1.), 0., 0.);\n"; return; case rsx::fog_mode::exponential: - OS << " vec4 fogc = exp(11.084 * (fog_param1 * fog_c + fog_param0 - 1.5));\n"; + OS << " vec4 fogc = vec4(11.084 * (fog_param1 * fog_c.x + fog_param0 - 1.5), exp(11.084 * (fog_param1 * fog_c.x + fog_param0 - 1.5)), 0., 0.);\n"; return; case rsx::fog_mode::exponential2: - OS << " vec4 fogc = exp(-pow(4.709 * (fog_param1 * fog_c + fog_param0 - 1.5)), 2.);\n"; + OS << " vec4 fogc = vec4(4.709 * (fog_param1 * fog_c.x + fog_param0 - 1.5), exp(-pow(4.709 * (fog_param1 * fog_c.x + fog_param0 - 1.5)), 2.), 0., 0.);\n"; return; case rsx::fog_mode::linear_abs: - OS << " vec4 fogc = fog_param1 * abs(fog_c) + (fog_param0 - 1.);\n"; + OS << " vec4 fogc = vec4(fog_param1 * abs(fog_c.x) + (fog_param0 - 1.), fog_param1 * abs(fog_c.x) + (fog_param0 - 1.), 0., 0.);\n"; return; case rsx::fog_mode::exponential_abs: - OS << " vec4 fogc = exp(11.084 * (fog_param1 * abs(fog_c) + fog_param0 - 1.5));\n"; + OS << " vec4 fogc = vec4(11.084 * (fog_param1 * abs(fog_c.x) + fog_param0 - 1.5), exp(11.084 * (fog_param1 * abs(fog_c.x) + fog_param0 - 1.5)), 0., 0.);\n"; return; case rsx::fog_mode::exponential2_abs: - OS << " vec4 fogc = exp(-pow(4.709 * (fog_param1 * abs(fog_c) + fog_param0 - 1.5)), 2.);\n"; + OS << " vec4 fogc = vec4(4.709 * (fog_param1 * abs(fog_c.x) + fog_param0 - 1.5), exp(-pow(4.709 * (fog_param1 * abs(fog_c.x) + fog_param0 - 1.5)), 2.), 0., 0.);\n"; return; } }