Define premultiply helper for quad shaders

This commit is contained in:
Héctor Ramón Jiménez 2025-05-03 22:33:55 +02:00
parent 469261e5a6
commit 9ac4c9f13d
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
3 changed files with 9 additions and 7 deletions

View file

@ -5,6 +5,10 @@ struct Globals {
@group(0) @binding(0) var<uniform> globals: Globals;
fn premultiply(color: vec4<f32>) -> vec4<f32> {
return vec4(color.xyz * color.a, color.a);
}
fn blend(over: vec4<f32>, under: vec4<f32>, alpha: f32) -> vec4<f32> {
return over * alpha + under * (1.0 - alpha);
}

View file

@ -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<f32>(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<f32> {
}
fn unpack_color(data: vec2<u32>) -> vec4<f32> {
let color = unpack_u32(data);
return vec4(color.xyz * color.a, color.a);
return premultiply(unpack_u32(data));
}
fn unpack_u32(data: vec2<u32>) -> vec4<f32> {

View file

@ -56,13 +56,13 @@ fn solid_vs_main(input: SolidVertexInput) -> SolidVertexOutput {
);
out.position = globals.transform * transform * vec4<f32>(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;