diff --git a/wgpu/src/shader/quad.wgsl b/wgpu/src/shader/quad.wgsl index 0a4cd7b4..bef8bd40 100644 --- a/wgpu/src/shader/quad.wgsl +++ b/wgpu/src/shader/quad.wgsl @@ -5,6 +5,10 @@ struct Globals { @group(0) @binding(0) var globals: Globals; +fn premultiply(color: vec4) -> vec4 { + return vec4(color.xyz * color.a, color.a); +} + fn blend(over: vec4, under: vec4, alpha: f32) -> vec4 { return over * alpha + under * (1.0 - alpha); } diff --git a/wgpu/src/shader/quad/gradient.wgsl b/wgpu/src/shader/quad/gradient.wgsl index ddd7d1c4..d743e26d 100644 --- a/wgpu/src/shader/quad/gradient.wgsl +++ b/wgpu/src/shader/quad/gradient.wgsl @@ -56,7 +56,7 @@ fn gradient_vs_main(input: GradientVertexInput) -> GradientVertexOutput { out.offsets = input.offsets; out.direction = input.direction * globals.scale; out.position_and_scale = vec4(pos, scale); - out.border_color = vec4(input.border_color.xyz * input.border_color.a, input.border_color.a); + out.border_color = premultiply(input.border_color); out.border_radius = border_radius * globals.scale; out.border_width = input.border_width * globals.scale; @@ -198,9 +198,7 @@ fn gradient_fs_main(input: GradientVertexOutput) -> @location(0) vec4 { } fn unpack_color(data: vec2) -> vec4 { - let color = unpack_u32(data); - - return vec4(color.xyz * color.a, color.a); + return premultiply(unpack_u32(data)); } fn unpack_u32(data: vec2) -> vec4 { diff --git a/wgpu/src/shader/quad/solid.wgsl b/wgpu/src/shader/quad/solid.wgsl index 979d7174..d5d1e604 100644 --- a/wgpu/src/shader/quad/solid.wgsl +++ b/wgpu/src/shader/quad/solid.wgsl @@ -56,13 +56,13 @@ fn solid_vs_main(input: SolidVertexInput) -> SolidVertexOutput { ); out.position = globals.transform * transform * vec4(vertex_position(input.vertex_index), 0.0, 1.0); - out.color = vec4(input.color.xyz * input.color.a, input.color.a); - out.border_color = vec4(input.border_color.xyz * input.border_color.a, input.border_color.a); + out.color = premultiply(input.color); + out.border_color = premultiply(input.border_color); out.pos = input.pos * globals.scale + snap; out.scale = input.scale * globals.scale; out.border_radius = border_radius * globals.scale; out.border_width = input.border_width * globals.scale; - out.shadow_color = vec4(input.shadow_color.xyz, input.shadow_color.a); + out.shadow_color = premultiply(input.shadow_color); out.shadow_offset = input.shadow_offset * globals.scale; out.shadow_blur_radius = input.shadow_blur_radius * globals.scale;