From e3d0af56e21a055a2ef45093e2aea5bbb18034f2 Mon Sep 17 00:00:00 2001 From: Andras Schmelczer Date: Sat, 29 Apr 2023 22:42:52 +0100 Subject: [PATCH] perlin --- src/pipelines/diffusion/diffuse.wgsl | 11 +++++++---- src/pipelines/diffusion/diffusion-pipeline.ts | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/pipelines/diffusion/diffuse.wgsl b/src/pipelines/diffusion/diffuse.wgsl index 34c5193..154cd45 100644 --- a/src/pipelines/diffusion/diffuse.wgsl +++ b/src/pipelines/diffusion/diffuse.wgsl @@ -12,11 +12,13 @@ struct Settings { @group(0) @binding(0) var settings: Settings; @group(0) @binding(1) var Sampler: sampler; @group(0) @binding(2) var trailMap: texture_2d; +@group(0) @binding(3) var noise: texture_2d; @fragment fn fragment(@location(0) uv: vec2) -> @location(0) vec4 { var current = textureSample(trailMap, Sampler, uv); - + let noise = textureSample(noise, Sampler, uv); + let neighbours: vec4 = ( textureSample(trailMap, Sampler, uv + vec2(0, 1) / settings.size) + textureSample(trailMap, Sampler, uv + vec2(0, -1) / settings.size) @@ -27,14 +29,15 @@ fn fragment(@location(0) uv: vec2) -> @location(0) vec4 { let mixedTrails = mix( current.rgb, neighbours.rgb, - settings.diffusionRateTrails + settings.diffusionRateTrails + (noise.rgb - vec3(0.5)) * 0.1 ) * (1.0 - settings.decayRateTrails); let mixedBrush = mix( current.a, neighbours.a, - settings.diffusionRateBrush - ) * (1.0 - settings.decayRateBrush); + settings.diffusionRateBrush + (noise.a - 0.5) * 0.5 + ) * (1.0 - settings.decayRateBrush - (noise.a - 0.5) * 0.1); + return clamp(vec4(mixedTrails, mixedBrush), vec4(0), vec4(1)); } diff --git a/src/pipelines/diffusion/diffusion-pipeline.ts b/src/pipelines/diffusion/diffusion-pipeline.ts index a7f85db..fe1fe48 100644 --- a/src/pipelines/diffusion/diffusion-pipeline.ts +++ b/src/pipelines/diffusion/diffusion-pipeline.ts @@ -1,4 +1,5 @@ import { setUpFullScreenQuad } from '../../utils/graphics/full-screen-quad/full-screen-quad'; +import { generateNoise } from '../../utils/graphics/noise/noise'; import { smartCompile } from '../../utils/smart-compile'; import { CommonParameters } from '../common-parameters'; import shader from './diffuse.wgsl'; @@ -10,11 +11,22 @@ export class DiffusionPipeline { private readonly pipeline: GPURenderPipeline; private readonly uniforms: GPUBuffer; private readonly quadVertexBuffer: GPUBuffer; + private readonly noise: GPUTexture; private bindGroup?: GPUBindGroup; private previousTrailMapIn?: GPUTexture; public constructor(private readonly device: GPUDevice) { + this.noise = generateNoise({ + device, + width: 256, + height: 256, + octaves: 8, + amplitude: 0.12, + gain: 0.7, + lacunarity: 80, + }); + const { buffer, vertex } = setUpFullScreenQuad(device); this.quadVertexBuffer = buffer; @@ -114,6 +126,10 @@ export class DiffusionPipeline { binding: 2, resource: trailMapIn.createView(), }, + { + binding: 3, + resource: this.noise.createView(), + }, ], });