summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar bunnei2015-10-01 18:34:10 -0400
committerGravatar bunnei2015-10-21 21:51:23 -0400
commit82f3e6dc69d23c3e70c1ad2805e2e15397cd9156 (patch)
treef12443b88d9f95d6bf2bbc1599ba4da47438df24
parentInitial implementation of fragment shader generation with caching. (diff)
downloadyuzu-82f3e6dc69d23c3e70c1ad2805e2e15397cd9156.tar.gz
yuzu-82f3e6dc69d23c3e70c1ad2805e2e15397cd9156.tar.xz
yuzu-82f3e6dc69d23c3e70c1ad2805e2e15397cd9156.zip
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.
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp4
-rw-r--r--src/video_core/renderer_opengl/gl_shader_util.cpp14
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() {
195 195
196 // Sync alpha reference 196 // Sync alpha reference
197 if (current_shader->uniform_alphatest_ref != -1) 197 if (current_shader->uniform_alphatest_ref != -1)
198 glUniform1f(current_shader->uniform_alphatest_ref, regs.output_merger.alpha_test.ref / 255.0f); 198 glUniform1i(current_shader->uniform_alphatest_ref, regs.output_merger.alpha_test.ref);
199 199
200 // Sync combiner buffer color 200 // Sync combiner buffer color
201 if (current_shader->uniform_tev_combiner_buffer_color != -1) { 201 if (current_shader->uniform_tev_combiner_buffer_color != -1) {
@@ -655,7 +655,7 @@ void RasterizerOpenGL::SyncBlendColor() {
655void RasterizerOpenGL::SyncAlphaTest() { 655void RasterizerOpenGL::SyncAlphaTest() {
656 const auto& regs = Pica::g_state.regs; 656 const auto& regs = Pica::g_state.regs;
657 if (current_shader->uniform_alphatest_ref != -1) 657 if (current_shader->uniform_alphatest_ref != -1)
658 glUniform1f(current_shader->uniform_alphatest_ref, regs.output_merger.alpha_test.ref / 255.0f); 658 glUniform1i(current_shader->uniform_alphatest_ref, regs.output_merger.alpha_test.ref);
659} 659}
660 660
661void RasterizerOpenGL::SyncLogicOp() { 661void 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)
336 shader += "false"; 336 shader += "false";
337 break; 337 break;
338 case CompareFunc::Equal: 338 case CompareFunc::Equal:
339 shader += "g_last_tex_env_out.a != alphatest_ref"; 339 shader += "int(g_last_tex_env_out.a * 255.0f) != alphatest_ref";
340 break; 340 break;
341 case CompareFunc::NotEqual: 341 case CompareFunc::NotEqual:
342 shader += "g_last_tex_env_out.a == alphatest_ref"; 342 shader += "int(g_last_tex_env_out.a * 255.0f) == alphatest_ref";
343 break; 343 break;
344 case CompareFunc::LessThan: 344 case CompareFunc::LessThan:
345 shader += "g_last_tex_env_out.a >= alphatest_ref"; 345 shader += "int(g_last_tex_env_out.a * 255.0f) >= alphatest_ref";
346 break; 346 break;
347 case CompareFunc::LessThanOrEqual: 347 case CompareFunc::LessThanOrEqual:
348 shader += "g_last_tex_env_out.a > alphatest_ref"; 348 shader += "int(g_last_tex_env_out.a * 255.0f) > alphatest_ref";
349 break; 349 break;
350 case CompareFunc::GreaterThan: 350 case CompareFunc::GreaterThan:
351 shader += "g_last_tex_env_out.a <= alphatest_ref"; 351 shader += "int(g_last_tex_env_out.a * 255.0f) <= alphatest_ref";
352 break; 352 break;
353 case CompareFunc::GreaterThanOrEqual: 353 case CompareFunc::GreaterThanOrEqual:
354 shader += "g_last_tex_env_out.a < alphatest_ref"; 354 shader += "int(g_last_tex_env_out.a * 255.0f) < alphatest_ref";
355 break; 355 break;
356 default: 356 default:
357 shader += "false"; 357 shader += "false";
@@ -370,7 +370,7 @@ std::string GenerateFragmentShader(const ShaderCacheKey& config) {
370in vec4 o[NUM_VTX_ATTR]; 370in vec4 o[NUM_VTX_ATTR];
371out vec4 color; 371out vec4 color;
372 372
373uniform float alphatest_ref; 373uniform int alphatest_ref;
374uniform vec4 const_color[NUM_TEV_STAGES]; 374uniform vec4 const_color[NUM_TEV_STAGES];
375uniform sampler2D tex[3]; 375uniform sampler2D tex[3];
376 376