summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/PixelShaderGen.cpp
diff options
context:
space:
mode:
authorPokechu22 <Pokechu022@gmail.com>2022-01-24 22:48:43 -0800
committerPokechu22 <Pokechu022@gmail.com>2022-02-08 15:15:15 -0800
commit444f6fd0cb84a673329cf33eacf8907bf96b5951 (patch)
treebbb8a34251b7369a4f39355d61dfacbbed60954e /Source/Core/VideoCommon/PixelShaderGen.cpp
parent0327e6acb4a4f883003fb00b04a8092a1914090a (diff)
Treat alpha as 0 if alpha is 1 for blending
This removes the white box in fortune street again, without causing Mario Kart Wii to regress.
Diffstat (limited to 'Source/Core/VideoCommon/PixelShaderGen.cpp')
-rw-r--r--Source/Core/VideoCommon/PixelShaderGen.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/PixelShaderGen.cpp b/Source/Core/VideoCommon/PixelShaderGen.cpp
index af21e64156..ddb03f8e96 100644
--- a/Source/Core/VideoCommon/PixelShaderGen.cpp
+++ b/Source/Core/VideoCommon/PixelShaderGen.cpp
@@ -1234,6 +1234,18 @@ ShaderCode GeneratePixelShaderCode(APIType api_type, const ShaderHostConfig& hos
use_dual_source || use_shader_blend);
}
+ // This situation is important for Mario Kart Wii's menus (they will render incorrectly if the
+ // alpha test for the FMV in the background fails, since they depend on depth for drawing a yellow
+ // border) and Fortune Street's gameplay (where a rectangle with an alpha value of 1 is drawn over
+ // the center of the screen several times, but those rectangles shouldn't be visible).
+ // Blending seems to result in no changes to the output with an alpha of 1, even if the input
+ // color is white.
+ // TODO: Investigate this further: we might be handling blending incorrectly in general (though
+ // there might not be any good way of changing blending behavior)
+ out.Write("\t// Hardware testing indicates that an alpha of 1 can pass an alpha test,\n"
+ "\t// but doesn't do anything in blending\n"
+ "\tif (prev.a == 1) prev.a = 0;\n");
+
if (uid_data->zfreeze)
{
out.SetConstantsUsed(C_ZSLOPE, C_ZSLOPE);