From 3f467d121229142177ef1b2f417fe87c7bf7fdf2 Mon Sep 17 00:00:00 2001 From: Jim Eckerlein Date: Sun, 24 Sep 2023 15:10:19 +0200 Subject: Compute vertex position in shader --- wgpu/src/shader/quad.wgsl | 8 ++++++++ wgpu/src/shader/quad/gradient.wgsl | 4 ++-- wgpu/src/shader/quad/solid.wgsl | 4 ++-- 3 files changed, 12 insertions(+), 4 deletions(-) (limited to 'wgpu/src/shader') diff --git a/wgpu/src/shader/quad.wgsl b/wgpu/src/shader/quad.wgsl index f919cfe2..555e81bb 100644 --- a/wgpu/src/shader/quad.wgsl +++ b/wgpu/src/shader/quad.wgsl @@ -37,3 +37,11 @@ fn select_border_radius(radi: vec4, position: vec2, center: vec2) rx = select(rx, ry, position.y > center.y); return rx; } + +// Compute the normalized quad coordinates based on the vertex index. +fn vertex_position(vertex_index: u32) -> vec2 { + // #: 0 1 2 3 4 5 + // x: 1 1 0 0 0 1 + // y: 1 0 0 0 1 1 + return vec2((vec2(1u, 2u) + vertex_index) % 6u < 3u); +} diff --git a/wgpu/src/shader/quad/gradient.wgsl b/wgpu/src/shader/quad/gradient.wgsl index 0754e97f..36cae61c 100644 --- a/wgpu/src/shader/quad/gradient.wgsl +++ b/wgpu/src/shader/quad/gradient.wgsl @@ -1,5 +1,5 @@ struct GradientVertexInput { - @location(0) v_pos: vec2, + @builtin(vertex_index) vertex_index: u32, @location(1) @interpolate(flat) colors_1: vec4, @location(2) @interpolate(flat) colors_2: vec4, @location(3) @interpolate(flat) colors_3: vec4, @@ -48,7 +48,7 @@ fn gradient_vs_main(input: GradientVertexInput) -> GradientVertexOutput { vec4(pos - vec2(0.5, 0.5), 0.0, 1.0) ); - out.position = globals.transform * transform * vec4(input.v_pos, 0.0, 1.0); + out.position = globals.transform * transform * vec4(vertex_position(input.vertex_index), 0.0, 1.0); out.colors_1 = input.colors_1; out.colors_2 = input.colors_2; out.colors_3 = input.colors_3; diff --git a/wgpu/src/shader/quad/solid.wgsl b/wgpu/src/shader/quad/solid.wgsl index ebd6d877..5fc5b13a 100644 --- a/wgpu/src/shader/quad/solid.wgsl +++ b/wgpu/src/shader/quad/solid.wgsl @@ -1,5 +1,5 @@ struct SolidVertexInput { - @location(0) v_pos: vec2, + @builtin(vertex_index) vertex_index: u32, @location(1) color: vec4, @location(2) pos: vec2, @location(3) scale: vec2, @@ -40,7 +40,7 @@ fn solid_vs_main(input: SolidVertexInput) -> SolidVertexOutput { vec4(pos - vec2(0.5, 0.5), 0.0, 1.0) ); - out.position = globals.transform * transform * vec4(input.v_pos, 0.0, 1.0); + out.position = globals.transform * transform * vec4(vertex_position(input.vertex_index), 0.0, 1.0); out.color = input.color; out.border_color = input.border_color; out.pos = pos; -- cgit