From 92bd2ea9adbe8eb491a5f818fe582fd8a2868a33 Mon Sep 17 00:00:00 2001 From: numzero Date: Sun, 17 Nov 2024 20:09:19 +0300 Subject: [PATCH] Temporal dithering --- src/bin/wireframe/main.rs | 2 +- src/bin/wireframe/mesh.wgsl | 3 ++- src/bin/wireframe/meshes.rs | 12 ++++++++---- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/bin/wireframe/main.rs b/src/bin/wireframe/main.rs index 2aff6e7..9d08d4d 100644 --- a/src/bin/wireframe/main.rs +++ b/src/bin/wireframe/main.rs @@ -199,7 +199,7 @@ impl<'a> State<'a> { required_features: wgpu::Features::PUSH_CONSTANTS | wgpu::Features::TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES, required_limits: wgpu::Limits { - max_push_constant_size: 16, + max_push_constant_size: 20, ..wgpu::Limits::default() }, memory_hints: Default::default(), diff --git a/src/bin/wireframe/mesh.wgsl b/src/bin/wireframe/mesh.wgsl index 0de69b4..4a96161 100644 --- a/src/bin/wireframe/mesh.wgsl +++ b/src/bin/wireframe/mesh.wgsl @@ -7,6 +7,7 @@ var camera: CameraUniform; struct MeshUniform { color: vec4, + seed: u32, } var mesh: MeshUniform; @@ -50,7 +51,7 @@ fn fs_main(in: VertexOutput) -> FragmentOutput { var y = bitcast(in.clip_position.y); var z = bitcast(in.clip_position.z); var alpha = in.vertex_color.w; - var seed = hash(hash(hash(x) ^ y) ^ z); + var seed = hash(hash(hash(mesh.seed ^ x) ^ y) ^ z); var mask = 0u; for (var sample = 0u; sample < 8u; sample++) { var threshold = f32(hash(seed ^ sample)) / 0x1p32; diff --git a/src/bin/wireframe/meshes.rs b/src/bin/wireframe/meshes.rs index e0e1798..9665681 100644 --- a/src/bin/wireframe/meshes.rs +++ b/src/bin/wireframe/meshes.rs @@ -15,6 +15,7 @@ struct Vertex { #[derive(Copy, Clone, Pod, Zeroable)] struct PushConsts { pub color: [f32; 4], + pub seed: u32, } #[derive(Copy, Clone)] @@ -23,15 +24,16 @@ pub struct Attrs { } impl Attrs { - fn consts(&self) -> PushConsts { + fn consts(&self, seed: u32) -> PushConsts { PushConsts { color: self.color.to_array(), + seed, } } } pub struct Mesh { - consts: PushConsts, + attrs: Attrs, npoints: u32, buf: wgpu::Buffer, } @@ -64,7 +66,7 @@ impl Mesh { usage: wgpu::BufferUsages::VERTEX, }); Mesh { - consts: attrs.consts(), + attrs, npoints: data.len() as u32, buf, } @@ -157,10 +159,12 @@ impl Renderer { cam_bind: &wgpu::BindGroup, meshes: impl Iterator, ) { + let seed = rand::random(); pass.set_pipeline(&self.pipeline); pass.set_bind_group(0, cam_bind, &[]); for mesh in meshes { - pass.set_push_constants(wgpu::ShaderStages::VERTEX, 0, bytes_of(&mesh.consts)); + let consts = mesh.attrs.consts(seed); + pass.set_push_constants(wgpu::ShaderStages::VERTEX, 0, bytes_of(&consts)); pass.set_vertex_buffer(0, mesh.buf.slice(..)); pass.draw(0..mesh.npoints, 0..1); }