From 121c2577b467ab5d5031b7afd9c2df2df198f2dd Mon Sep 17 00:00:00 2001 From: Mike Welsh Date: Thu, 12 May 2022 11:46:52 -0700 Subject: [PATCH] wgpu: Clamp alpha in shaders (fix #6954) --- render/wgpu/shaders/bitmap.wgsl | 3 ++- render/wgpu/shaders/color.wgsl | 9 +++++---- render/wgpu/shaders/gradient.wgsl | 3 ++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/render/wgpu/shaders/bitmap.wgsl b/render/wgpu/shaders/bitmap.wgsl index 0992dc1e4..3b2c639ef 100644 --- a/render/wgpu/shaders/bitmap.wgsl +++ b/render/wgpu/shaders/bitmap.wgsl @@ -28,7 +28,8 @@ fn main_fragment(in: VertexOutput) -> [[location(0)]] vec4 { if( color.a > 0.0 ) { color = vec4(color.rgb / color.a, color.a); color = color * transforms.mult_color + transforms.add_color; - color = vec4(color.rgb * color.a, color.a); + let alpha = clamp(color.a, 0.0, 1.0); + color = vec4(color.rgb * alpha, alpha); } return color; } diff --git a/render/wgpu/shaders/color.wgsl b/render/wgpu/shaders/color.wgsl index b42c80d0b..55d9bc3c6 100644 --- a/render/wgpu/shaders/color.wgsl +++ b/render/wgpu/shaders/color.wgsl @@ -7,12 +7,13 @@ struct VertexOutput { [[stage(vertex)]] fn main_vertex(in: VertexInput) -> VertexOutput { - let pos: vec4 = globals.view_matrix * transforms.world_matrix * vec4(in.position.x, in.position.y, 0.0, 1.0); - return VertexOutput(pos, in.color); + let pos = globals.view_matrix * transforms.world_matrix * vec4(in.position.x, in.position.y, 0.0, 1.0); + let color = in.color * transforms.mult_color + transforms.add_color; + let alpha = clamp(color.a, 0.0, 1.0); + return VertexOutput(pos, vec4(color.rgb * alpha, alpha)); } [[stage(fragment)]] fn main_fragment(in: VertexOutput) -> [[location(0)]] vec4 { - let out = in.color * transforms.mult_color + transforms.add_color; - return vec4(out.rgb * out.a, out.a); + return in.color; } diff --git a/render/wgpu/shaders/gradient.wgsl b/render/wgpu/shaders/gradient.wgsl index f037ca28c..a2ae6dd40 100644 --- a/render/wgpu/shaders/gradient.wgsl +++ b/render/wgpu/shaders/gradient.wgsl @@ -102,5 +102,6 @@ fn main_fragment(in: VertexOutput) -> [[location(0)]] vec4 { color = linear_to_srgb(color); } let out = color * transforms.mult_color + transforms.add_color; - return vec4(out.rgb * out.a, out.a); + let alpha = clamp(out.a, 0.0, 1.0); + return vec4(out.rgb * alpha, alpha); }