diff --git a/internal/graphicsdriver/directx/pipeline_windows.go b/internal/graphicsdriver/directx/pipeline_windows.go index 8ce84a356..1f5e7df8f 100644 --- a/internal/graphicsdriver/directx/pipeline_windows.go +++ b/internal/graphicsdriver/directx/pipeline_windows.go @@ -221,7 +221,8 @@ float4 PSMain(PSInput input) : SV_TARGET { color = mul(color_matrix_body, color) + color_matrix_translation; // Premultiply alpha color.rgb *= color.a; - // Do not apply the color scale as the scale should always be (1, 1, 1, 1) when a color matrix is used. + // Apply color scale. + color *= input.color; // Clamp the output. color.rgb = min(color.rgb, color.a); return color; diff --git a/internal/graphicsdriver/metal/graphics_darwin.go b/internal/graphicsdriver/metal/graphics_darwin.go index f128a4529..351b638d1 100644 --- a/internal/graphicsdriver/metal/graphics_darwin.go +++ b/internal/graphicsdriver/metal/graphics_darwin.go @@ -197,6 +197,7 @@ struct FragmentShaderImpl { c.rgb /= c.a + (1.0 - sign(c.a)); c = (color_matrix_body * c) + color_matrix_translation; c.rgb *= c.a; + c *= v.color; c.rgb = min(c.rgb, c.a); } else { c *= v.color; diff --git a/internal/graphicsdriver/opengl/defaultshader.go b/internal/graphicsdriver/opengl/defaultshader.go index 60bce1935..148f9b1e0 100644 --- a/internal/graphicsdriver/opengl/defaultshader.go +++ b/internal/graphicsdriver/opengl/defaultshader.go @@ -237,12 +237,14 @@ void main(void) { color = (color_matrix_body * color) + color_matrix_translation; // Premultiply alpha color.rgb *= color.a; - // Do not apply the color scale as the scale should always be (1, 1, 1, 1) when a color matrix is used. + // Apply color scale. + color *= varying_color_scale; // Clamp the output. color.rgb = min(color.rgb, color.a); # else - // Apply the color scale. + // Apply color scale. color *= varying_color_scale; + // No clamping needed as the color matrix shader is used then. # endif // defined(USE_COLOR_MATRIX) gl_FragColor = color;