فهرست منبع

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 سال پیش
والد
کامیت
82f3e6dc69
2فایلهای تغییر یافته به همراه9 افزوده شده و 9 حذف شده
  1. 2 2
      src/video_core/renderer_opengl/gl_rasterizer.cpp
  2. 7 7
      src/video_core/renderer_opengl/gl_shader_util.cpp

+ 2 - 2
src/video_core/renderer_opengl/gl_rasterizer.cpp

@@ -195,7 +195,7 @@ void RasterizerOpenGL::RegenerateShaders() {
 
 
     // Sync alpha reference
     // Sync alpha reference
     if (current_shader->uniform_alphatest_ref != -1)
     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
     // Sync combiner buffer color
     if (current_shader->uniform_tev_combiner_buffer_color != -1) {
     if (current_shader->uniform_tev_combiner_buffer_color != -1) {
@@ -655,7 +655,7 @@ void RasterizerOpenGL::SyncBlendColor() {
 void RasterizerOpenGL::SyncAlphaTest() {
 void RasterizerOpenGL::SyncAlphaTest() {
     const auto& regs = Pica::g_state.regs;
     const auto& regs = Pica::g_state.regs;
     if (current_shader->uniform_alphatest_ref != -1)
     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() {
 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";
             shader += "false";
             break;
             break;
         case CompareFunc::Equal:
         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;
             break;
         case CompareFunc::NotEqual:
         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;
             break;
         case CompareFunc::LessThan:
         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;
             break;
         case CompareFunc::LessThanOrEqual:
         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;
             break;
         case CompareFunc::GreaterThan:
         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;
             break;
         case CompareFunc::GreaterThanOrEqual:
         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;
             break;
         default:
         default:
             shader += "false";
             shader += "false";
@@ -370,7 +370,7 @@ std::string GenerateFragmentShader(const ShaderCacheKey& config) {
 in vec4 o[NUM_VTX_ATTR];
 in vec4 o[NUM_VTX_ATTR];
 out vec4 color;
 out vec4 color;
 
 
-uniform float alphatest_ref;
+uniform int alphatest_ref;
 uniform vec4 const_color[NUM_TEV_STAGES];
 uniform vec4 const_color[NUM_TEV_STAGES];
 uniform sampler2D tex[3];
 uniform sampler2D tex[3];