diff options
| author | 2015-10-01 18:34:10 -0400 | |
|---|---|---|
| committer | 2015-10-21 21:51:23 -0400 | |
| commit | 82f3e6dc69d23c3e70c1ad2805e2e15397cd9156 (patch) | |
| tree | f12443b88d9f95d6bf2bbc1599ba4da47438df24 | |
| parent | Initial implementation of fragment shader generation with caching. (diff) | |
| download | yuzu-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.cpp | 4 | ||||
| -rw-r--r-- | 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() { | |||
| 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() { | |||
| 655 | void RasterizerOpenGL::SyncAlphaTest() { | 655 | void 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 | ||
| 661 | void RasterizerOpenGL::SyncLogicOp() { | 661 | 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) | |||
| 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) { | |||
| 370 | in vec4 o[NUM_VTX_ATTR]; | 370 | in vec4 o[NUM_VTX_ATTR]; |
| 371 | out vec4 color; | 371 | out vec4 color; |
| 372 | 372 | ||
| 373 | uniform float alphatest_ref; | 373 | uniform int alphatest_ref; |
| 374 | uniform vec4 const_color[NUM_TEV_STAGES]; | 374 | uniform vec4 const_color[NUM_TEV_STAGES]; |
| 375 | uniform sampler2D tex[3]; | 375 | uniform sampler2D tex[3]; |
| 376 | 376 | ||