From 5e97ff8eca930b8023429e6b9fd913fe689f2a0c Mon Sep 17 00:00:00 2001 From: numzero Date: Tue, 24 Dec 2024 02:07:51 +0300 Subject: [PATCH] A nice texture --- src/bin/envmap/perlin.wgsl | 72 +++++++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 20 deletions(-) diff --git a/src/bin/envmap/perlin.wgsl b/src/bin/envmap/perlin.wgsl index e9ce581..b07bb7c 100644 --- a/src/bin/envmap/perlin.wgsl +++ b/src/bin/envmap/perlin.wgsl @@ -22,37 +22,69 @@ fn on_vertex(in: Vertex) -> Varying { @fragment fn on_fragment(in: Varying) -> @location(0) vec4f { - let point = in.world; -// let point = 10. * normalize(in.world - vec3f(0., 0., -10.)); + let sharp_area = perlin_noise(Params(1, 3, 0.9, 2.0), 0.1 * in.world); + let sharp_base = perlin_noise(Params(1, 6, 0.9, 2.0), 0.1 * in.world); + let cloud_base = perlin_noise(Params(2, 8, 0.6, 2.0), 0.1 * in.world); + let sharp_detail = structured_noise(Params(11, 8, 3.0, 2.0), in.world); + let cloud_detail1 = perlin_noise(Params(12, 8, 0.7, 2.0), in.world); + let cloud_detail2 = perlin_noise(Params(13, 8, 0.7, 2.0), in.world); + let dust = sharp_noise(Params(21, 8, 0.9, 2.0), in.world); + let stars = sharp_noise(Params(22, 8, 2.7, 2.0), in.world); + + let cloud = exp(5.0 * (cloud_base - 1.0)); + let cloud1 = cloud * (2.0 + cloud_detail1); + let cloud2 = cloud * (2.0 + cloud_detail2); + let tint = clamp(sharp_area - 0.2, 0.0, 0.3) / 0.3 * max(0.0, sharp_base - 0.3) * max(0.0, cloud_base + 0.3) * max(0.0, sharp_detail); + return vec4( +// dust * vec3(0.0, 0.3, 0.0) + +// max(0.0, sin(stars - 1.5) * vec3(0.3, 0.2, 0.1) + +// max(0.0, stars - 2.0) * vec3(0.3, 0.5, 2.0) + + cloud1 * vec3(0.1, 0.2, 1.0) + + cloud2 * vec3(0.1, 0.3, 0.7) + + tint * vec3(4.0, 0.0, 0.4) + + max(0.0, tint - 0.1) * vec3(0.0, 4.0, 0.0), + 1.0); +} + +fn sharp_noise(params: Params, point: vec3f) -> f32 { + var result = 1.0; + var hscale = 1.0; + var seed = params.seed; + for (var layer = 0u; layer < params.layers; layer++) { + result *= pow(4.0 * abs(perlin_layer(seed, hscale * point)), params.roughness); + hscale *= params.scale; + seed = hash(seed); + } + return result; +} + +fn structured_noise(params: Params, point: vec3f) -> f32 { + var result = 1.0; + var hscale = 1.0; + var seed = params.seed; + for (var layer = 0u; layer < params.layers; layer++) { + result *= pow(clamp(1. + perlin_layer(seed, hscale * point), 0., 1.), params.roughness); + hscale *= params.scale; + seed = hash(seed); + } + return result; +} + +fn perlin_noise(params: Params, point: vec3f) -> f32 { 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 * point); + result += vscale * perlin_layer(seed, hscale * point); hscale *= params.scale; vscale *= params.roughness; seed = hash(seed); } - return vec4(0.5 + 0.25 * result); + return result; } -// @fragment -// fn on_fragment(in: Varying) -> @location(0) vec4f { -// let point = in.world; -// var result = 1.0; -// var hscale = 1.0; -// var seed = params.seed; -// for (var layer = 0u; layer < params.layers; layer++) { -// result *= pow(4.0 * abs(noise(seed, hscale * point)), 0.2); -// result *= pow(clamp(1. + noise(seed, hscale * point), 0., 1.), 3.0); -// hscale *= params.scale; -// seed = hash(seed); -// } -// return vec4(result); -// } - -fn noise(seed: u32, coords: vec3f) -> f32 { +fn perlin_layer(seed: u32, coords: vec3f) -> f32 { let s = split(coords); var ret = 0.0; for (var i = 0u; i < 2; i++) {