Layered noise

This commit is contained in:
numzero 2024-12-23 22:35:14 +03:00
parent b4b1805ce2
commit f051b812f5
3 changed files with 20 additions and 7 deletions

View File

@ -37,8 +37,9 @@ fn main() {
&queue, &queue,
perlin::Params { perlin::Params {
seed: 42, seed: 42,
layers: 4, layers: 8,
persistence: 0.5, roughness: 0.9,
scale: 1.7,
}, },
); );

View File

@ -8,7 +8,8 @@ use glam::{Vec2, Vec3};
pub struct Params { pub struct Params {
pub seed: u32, pub seed: u32,
pub layers: u32, pub layers: u32,
pub persistence: f32, pub roughness: f32,
pub scale: f32,
} }
#[derive(Debug, Clone, Copy, Pod, Zeroable)] #[derive(Debug, Clone, Copy, Pod, Zeroable)]

View File

@ -1,7 +1,8 @@
struct Params { struct Params {
seed: u32, seed: u32,
layers: u32, layers: u32,
persistence: f32, roughness: f32,
scale: f32,
} }
struct Vertex { struct Vertex {
@ -23,16 +24,26 @@ fn on_vertex(in: Vertex) -> Varying {
@fragment @fragment
fn on_fragment(in: Varying) -> @location(0) vec4f { 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); let s = split(coords);
var ret = 0.0; var ret = 0.0;
for (var i = 0u; i < 2; i++) { for (var i = 0u; i < 2; i++) {
for (var j = 0u; j < 2; j++) { for (var j = 0u; j < 2; j++) {
for (var k = 0u; k < 2; k++) { for (var k = 0u; k < 2; k++) {
ret += part(params.seed, s, vec3u(i, j, k)); ret += part(seed, s, vec3u(i, j, k));
} }
} }
} }