From f051b812f57ae5351a1bed353f9d844013339a86 Mon Sep 17 00:00:00 2001 From: numzero Date: Mon, 23 Dec 2024 22:35:14 +0300 Subject: [PATCH] Layered noise --- src/bin/envmap/main.rs | 5 +++-- src/bin/envmap/perlin.rs | 3 ++- src/bin/envmap/perlin.wgsl | 19 +++++++++++++++---- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/bin/envmap/main.rs b/src/bin/envmap/main.rs index 7952348..985aef0 100644 --- a/src/bin/envmap/main.rs +++ b/src/bin/envmap/main.rs @@ -37,8 +37,9 @@ fn main() { &queue, perlin::Params { seed: 42, - layers: 4, - persistence: 0.5, + layers: 8, + roughness: 0.9, + scale: 1.7, }, ); diff --git a/src/bin/envmap/perlin.rs b/src/bin/envmap/perlin.rs index c366db2..f568b33 100644 --- a/src/bin/envmap/perlin.rs +++ b/src/bin/envmap/perlin.rs @@ -8,7 +8,8 @@ use glam::{Vec2, Vec3}; pub struct Params { pub seed: u32, pub layers: u32, - pub persistence: f32, + pub roughness: f32, + pub scale: f32, } #[derive(Debug, Clone, Copy, Pod, Zeroable)] diff --git a/src/bin/envmap/perlin.wgsl b/src/bin/envmap/perlin.wgsl index 08ea11b..e5fbef6 100644 --- a/src/bin/envmap/perlin.wgsl +++ b/src/bin/envmap/perlin.wgsl @@ -1,7 +1,8 @@ struct Params { seed: u32, layers: u32, - persistence: f32, + roughness: f32, + scale: f32, } struct Vertex { @@ -23,16 +24,26 @@ fn on_vertex(in: Vertex) -> Varying { @fragment fn on_fragment(in: Varying) -> @location(0) vec4f { - return vec4(0.5 + 0.5 * noise(in.world)); + var result = 0.0; + var hscale = 1.0; + var vscale = 1.0; + var seed = params.seed; + for (var layer = 0u; layer < params.layers; layer++) { + result += vscale * noise(seed, hscale * in.world); + hscale *= params.scale; + vscale *= params.roughness; + seed = hash(seed); + } + return vec4(0.5 + 0.25 * result); } -fn noise(coords: vec3f) -> f32 { +fn noise(seed: u32, coords: vec3f) -> f32 { let s = split(coords); var ret = 0.0; for (var i = 0u; i < 2; i++) { for (var j = 0u; j < 2; j++) { for (var k = 0u; k < 2; k++) { - ret += part(params.seed, s, vec3u(i, j, k)); + ret += part(seed, s, vec3u(i, j, k)); } } }