Просмотр исходного кода

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.

bunnei 10 лет назад
Родитель
Сommit
82f3e6dc69

+ 2 - 2
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() {

+ 7 - 7
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];