From 82f3e6dc69d23c3e70c1ad2805e2e15397cd9156 Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 1 Oct 2015 18:34:10 -0400 Subject: [PATCH] gl_shader_util: Fix precision bug with alpha testing. - Alpha testing is not done with float32 precision, this makes the HW renderer match the SW renderer. --- src/video_core/renderer_opengl/gl_rasterizer.cpp | 4 ++-- src/video_core/renderer_opengl/gl_shader_util.cpp | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 45329d561..38d184ae2 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -195,7 +195,7 @@ void RasterizerOpenGL::RegenerateShaders() { // Sync alpha reference if (current_shader->uniform_alphatest_ref != -1) - glUniform1f(current_shader->uniform_alphatest_ref, regs.output_merger.alpha_test.ref / 255.0f); + glUniform1i(current_shader->uniform_alphatest_ref, regs.output_merger.alpha_test.ref); // Sync combiner buffer color if (current_shader->uniform_tev_combiner_buffer_color != -1) { @@ -655,7 +655,7 @@ void RasterizerOpenGL::SyncBlendColor() { void RasterizerOpenGL::SyncAlphaTest() { const auto& regs = Pica::g_state.regs; if (current_shader->uniform_alphatest_ref != -1) - glUniform1f(current_shader->uniform_alphatest_ref, regs.output_merger.alpha_test.ref / 255.0f); + glUniform1i(current_shader->uniform_alphatest_ref, regs.output_merger.alpha_test.ref); } void RasterizerOpenGL::SyncLogicOp() { diff --git a/src/video_core/renderer_opengl/gl_shader_util.cpp b/src/video_core/renderer_opengl/gl_shader_util.cpp index ee32f6a31..2c049e940 100644 --- a/src/video_core/renderer_opengl/gl_shader_util.cpp +++ b/src/video_core/renderer_opengl/gl_shader_util.cpp @@ -336,22 +336,22 @@ void AppendAlphaTestCondition(std::string& shader, Pica::Regs::CompareFunc func) shader += "false"; break; case CompareFunc::Equal: - shader += "g_last_tex_env_out.a != alphatest_ref"; + shader += "int(g_last_tex_env_out.a * 255.0f) != alphatest_ref"; break; case CompareFunc::NotEqual: - shader += "g_last_tex_env_out.a == alphatest_ref"; + shader += "int(g_last_tex_env_out.a * 255.0f) == alphatest_ref"; break; case CompareFunc::LessThan: - shader += "g_last_tex_env_out.a >= alphatest_ref"; + shader += "int(g_last_tex_env_out.a * 255.0f) >= alphatest_ref"; break; case CompareFunc::LessThanOrEqual: - shader += "g_last_tex_env_out.a > alphatest_ref"; + shader += "int(g_last_tex_env_out.a * 255.0f) > alphatest_ref"; break; case CompareFunc::GreaterThan: - shader += "g_last_tex_env_out.a <= alphatest_ref"; + shader += "int(g_last_tex_env_out.a * 255.0f) <= alphatest_ref"; break; case CompareFunc::GreaterThanOrEqual: - shader += "g_last_tex_env_out.a < alphatest_ref"; + shader += "int(g_last_tex_env_out.a * 255.0f) < alphatest_ref"; break; default: shader += "false"; @@ -370,7 +370,7 @@ std::string GenerateFragmentShader(const ShaderCacheKey& config) { in vec4 o[NUM_VTX_ATTR]; out vec4 color; -uniform float alphatest_ref; +uniform int alphatest_ref; uniform vec4 const_color[NUM_TEV_STAGES]; uniform sampler2D tex[3];