www.xbdev.net
xbdev - software development
Sunday May 3, 2026
Home | Contact | Support | WebGPU Graphics and Compute ...
     
 

WebGPU/WGSL Tutorials and Articles

Graphics and Compute ...

 


Procedural Textures


Generating textures using various algorithms - from wood and stone through to lava, dirt and fabrics.


Natural Materials
1. Wood Grain: Mimics the rings of a tree using sinusoidal and noise-based modulation.
2. Marble: Simulates marble veining with sine functions combined with turbulence.
3. Stone/Granite: Produces rugged surfaces using fractal noise with fine jitter.
4. Sand/Dirt: Grainy patterns with FBM (Fractal Brownian Motion) noise.
5. Water/Waves: Undulating wave patterns using layered sinusoids.
6. Fire/Flames: Animated turbulence with a fiery color gradient.
7. Clouds: Soft, billowy patterns from smooth FBM noise.


Geometric Patterns
8. Checkerboard: Alternating squares of contrasting colors.
9. Stripes: Horizontal or vertical repeating bands.
10. Polka Dots: Repeated circular patterns with uniform or random distribution.
11. Hexagonal Grid: Honeycomb-like tessellation.
12. Triangle Grid: Tessellated triangular arrangements.
13. Wave Patterns: Sinusoidal waves, optionally layered for complexity.
14. Concentric Circles: Expanding rings emanating from a center.
15. Radial Gradient: Smooth transitions radiating outward from a point.
16. Spiral: Coiled patterns created with polar coordinates.

Organic/Abstract Patterns
17. Veins/Cracks: Geological fault patterns using Voronoi noise.
18. Bubbles: Randomized circular shapes resembling foam.
19. Plasma: Swirling, colorful, and dynamic noise patterns.
20. Interference: Moiré effects from overlapping sine waves.
21. Growth Rings: Concentric patterns mimicking organic growth.
22. Lava: Animated molten rock textures with turbulent distortion.


Synthetic Textures
23. Metallic Brushed: Anisotropic noise for brushed metal effects.
24. Circuit Board: Geometric, grid-like patterns with fine detail.
25. Carbon Fiber: Woven, tight checkerboard patterns.
26. Brick Wall: Offset rectangular patterns for walls.
27. Fabric/Weave: Intersecting sine waves mimicking textile patterns.

Procedural Variations
28. Fractal Terrain: Mountain-like patterns with height maps.
29. Gaseous Nebula: Colorful, swirling patterns resembling space phenomena.
30. Stained Glass: Randomized Voronoi cells with bright colors.
31. Lightning: Jagged, branching patterns from fractal techniques.
32. Pebble Path: Coherent scatter of rounded shapes.
33. Grass: Thin, randomized lines simulating blades of grass.
34. Snowflakes: Geometric, fractal-like patterns for snow crystals.
35. Wood Bark: Ridged, layered noise for bark textures.

Mathematical Patterns
36. Mandelbrot Set: Complex fractal patterns with infinite detail.
37. Julia Set: Parameterized fractals similar to Mandelbrot.
38. Moire Patterns: Overlapping grids creating interference effects.
39. Sinusoidal Grids: Ripple-like patterns from intersecting sine waves.
40. Tiled Fractals: Fractal shapes repeated within a tile grid.

Animated/Temporal Patterns
41. Flow Fields: Simulates fluid-like directional motion.
42. Ripples: Expanding wave rings resembling raindrop ripples.
43. Pulsing Rings: Oscillating concentric circles.
44. Fading Stripes: Time-based transitions between stripe patterns.
45. Morphing Grid: Dynamically distorting grid patterns.

Color-Based Patterns
46. Rainbow Gradient: Smooth transitions across the color spectrum.
47. Heatmap: Gradient patterns similar to thermal imaging.
48. Fluorescent Glow: Radial gradients with a glowing effect.
49. Iridescence: Thin-film interference patterns.
50. Grayscale Noise: Monochrome noise for masking or blending.




For fun, lets put all the textures on a single image!
For fun, lets put all the textures on a single image!





Example Implementations


Obviously their is dozens of different ways to implement the texture algorithms - but to get you started and give you an idea the following gives you a simple example.



1. Wood Grain

// Default parameters: scale=10.0, grainIntensity=5.0
fn woodTexture(uv: vec2<f32>, scale: f32 = 10.0, grainIntensity: f32 = 5.0) -> vec3<f32> {
    let rings = scale * uv.x + grainIntensity * sin(scale * uv.y);
    let grain = abs(sin(rings));
    return vec3<f32>(grain, grain * 0.5, grain * 0.2);
}



2. Marble

// Default parameters: scale=5.0, turbulence=2.0
fn marbleTexture(uv: vec2<f32>, scale: f32 = 5.0, turbulence: f32 = 2.0) -> vec3<f32> {
    let veins = sin(uv.x * scale + turbulence * sin(uv.y * scale));
    let marble = 0.5 + 0.5 * veins;
    return vec3<f32>(marble, marble, marble * 0.8);
}



3. Stone/Granite

// Default parameters: scale=8.0, roughness=0.5
fn stoneTexture(uv: vec2<f32>, scale: f32 = 8.0, roughness: f32 = 0.5) -> vec3<f32> {
    let noise = fract(sin(dot(uv, vec2<f32>(scale, scale))) * 43758.5453);
    let texture = mix(1.0, noise, roughness);
    return vec3<f32>(texture * 0.7, texture * 0.6, texture * 0.4);
}



4. Sand/Dirt

// Default parameters: scale=10.0, noiseFactor=0.5
fn sandTexture(uv: vec2<f32>, scale: f32 = 10.0, noiseFactor: f32 = 0.5) -> vec3<f32> {
    let noise = fract(sin(dot(uv, vec2<f32>(scale, scale))) * 43758.5453);
    let dirt = mix(0.7, 0.9, noise * noiseFactor);
    return vec3<f32>(dirt, dirt * 0.8, dirt * 0.5);
}



5. Water/Waves

// Default parameters: scale=1.0, frequency=5.0
fn waterRippleTexture(uv: vec2<f32>, scale: f32 = 1.0, frequency: f32 = 5.0) -> vec3<f32> {
    let ripple = sin(uv.x * frequency + uv.y * frequency);
    return vec3<f32>(0.0, 0.5 + 0.5 * ripple, 1.0);
}



6. Fire/Flames

// Default parameters: scale=2.0, turbulence=3.0
fn fireTexture(uv: vec2<f32>, scale: f32 = 2.0, turbulence: f32 = 3.0) -> vec3<f32> {
    let flame = abs(sin(uv.x * scale + turbulence * sin(uv.y * scale)));
    return vec3<f32>(flame, flame * 0.5, 0.0);
}



7. Clouds

// Default parameters: scale=5.0, softness=0.6
fn cloudTexture(uv: vec2<f32>, scale: f32 = 5.0, softness: f32 = 0.6) -> vec3<f32> {
    let noise = fract(sin(dot(uv, vec2<f32>(scale, scale))) * 43758.5453);
    let clouds = smoothstep(softness, 1.0, noise);
    return vec3<f32>(clouds * 0.8, clouds * 0.8, clouds * 0.9);
}




Geometric Patterns



8. Checkerboard

// Default parameters: scale=5.0
fn checkerboardTexture(uv: vec2<f32>, scale: f32 = 5.0) -> vec3<f32> {
    let checker = mod(floor(uv * scale), 2.0);
    return vec3<f32>(checker.x, checker.y, 0.0);
}



9. Stripes

// Default parameters: scale=5.0, direction=1.0
fn stripeTexture(uv: vec2<f32>, scale: f32 = 5.0, direction: f32 = 1.0) -> vec3<f32> {
    let stripe = mod(floor(uv.x * scale + direction), 2.0);
    return vec3<f32>(stripe, 0.0, 0.0);
}



10. Polka Dots

// Default parameters: scale=10.0, radius=0.2
fn polkaDotTexture(uv: vec2<f32>, scale: f32 = 10.0, radius: f32 = 0.2) -> vec3<f32> {
    let center = fract(uv * scale);
    let dist = length(center - 0.5);
    return vec3<f32>(step(dist, radius), 0.0, 0.0);
}



11. Hexagonal Grid

// Default parameters: scale=10.0
fn hexagonalGrid(uv: vec2<f32>, scale: f32 = 10.0) -> vec3<f32> {
    let hex = mod(floor(uv * scale), 2.0);
    return vec3<f32>(hex.x, hex.y, 0.0);
}



12. Triangle Grid

// Default parameters: scale=10.0
fn triangleGrid(uv: vec2<f32>, scale: f32 = 10.0) -> vec3<f32> {
    let tri = mod(floor(uv * scale), 2.0);
    return vec3<f32>(tri.x, 0.0, tri.y);
}



13. Wave Patterns

// Default parameters: frequency=5.0
fn wavePattern(uv: vec2<f32>, frequency: f32 = 5.0) -> vec3<f32> {
    let wave = sin(uv.x * frequency) + sin(uv.y * frequency);
    return vec3<f32>(wave * 0.5 + 0.5, 0.0, 0.0);
}



14. Concentric Circles

// Default parameters: scale=5.0, center=0.5
fn concentricCircles(uv: vec2<f32>, scale: f32 = 5.0, center: f32 = 0.5) -> vec3<f32> {
    let dist = length(uv - vec2<f32>(center, center)) * scale;
    let rings = sin(dist);
    return vec3<f32>(rings * 0.5 + 0.5, rings * 0.3, rings * 0.1);
}



15. Radial Gradient

// Default parameters: scale=5.0
fn radialGradient(uv: vec2<f32>, scale: f32 = 5.0) -> vec3<f32> {
    let dist = length(uv - 0.5) * scale;
    return vec3<f32>(dist, dist * 0.5, dist * 0.2);
}



16. Spiral

// Default parameters: scale=5.0, turnCount=5.0
fn spiralTexture(uv: vec2<f32>, scale: f32 = 5.0, turnCount: f32 = 5.0) -> vec3<f32> {
    let angle = atan2(uv.y - 0.5, uv.x - 0.5);
    let radius = length(uv - 0.5) * scale;
    let spiral = sin(angle * turnCount + radius);
    return vec3<f32>(spiral * 0.5 + 0.5, spiral * 0.4, spiral * 0.3);
}




Organic/Abstract Patterns



17. Veins/Cracks

// Default parameters: scale=5.0, roughness=1.0
fn veinsTexture(uv: vec2<f32>, scale: f32 = 5.0, roughness: f32 = 1.0) -> vec3<f32> {
    let veins = fract(sin(dot(uv, vec2<f32>(scale, scale))) * 43758.5453);
    return vec3<f32>(veins * roughness, veins * roughness * 0.6, 0.0);
}



18. Bubbles

// Default parameters: scale=10.0, size=0.1
fn bubblesTexture(uv: vec2<f32>, scale: f32 = 10.0, size: f32 = 0.1) -> vec3<f32> {
    let dist = length(fract(uv * scale) - 0.5);
    return vec3<f32>(step(dist, size), 0.5, 1.0);
}



19. Plasma

// Default parameters: scale=5.0, turbulence=0.5
fn plasmaTexture(uv: vec2<f32>, scale: f32 = 5.0, turbulence: f32 = 0.5) -> vec3<f32> {
    let noise = sin(uv.x * scale + turbulence * cos(uv.y * scale));
    return vec3<f32>(noise * 0.5 + 0.5, noise * 0.3 + 0.5, noise * 0.2 + 0.5);
}



20. Interference

// Default parameters: scale=5.0, amplitude=0.5
fn interferenceTexture(uv: vec2<f32>, scale: f32 = 5.0, amplitude: f32 = 0.5) -> vec3<f32> {
    let interference = sin(uv.x * scale + uv.y * scale) * amplitude;
    return vec3<f32>(interference, interference * 0.5, interference * 0.3);
}



21. Growth Rings

// Default parameters: scale=5.0, rings=10.0
fn growthRingsTexture(uv: vec2<f32>, scale: f32 = 5.0, rings: f32 = 10.0) -> vec3<f32> {
    let dist = length(uv - 0.5) * scale;
    let ring = sin(dist * rings);
    return vec3<f32>(ring * 0.8 + 0.2, ring * 0.6 + 0.4, ring * 0.4 + 0.2);
}



22. Lava

// Default parameters: scale=5.0, intensity=1.5
fn lavaTexture(uv: vec2<f32>, scale: f32 = 5.0, intensity: f32 = 1.5) -> vec3<f32> {
    let noise = fract(sin(dot(uv, vec2<f32>(scale, scale))) * 43758.5453);
    let lava = noise * intensity;
    return vec3<f32>(lava * 1.0, lava * 0.5, lava * 0.0);
}




Synthetic Textures




23. Metallic Brushed

// Default parameters: scale=5.0, roughness=0.3
fn metallicBrushedTexture(uv: vec2<f32>, scale: f32 = 5.0, roughness: f32 = 0.3) -> vec3<f32> {
    let noise = fract(sin(dot(uv, vec2<f32>(scale, scale))) * 43758.5453);
    let metallic = mix(0.5, 1.0, noise * roughness);
    return vec3<f32>(metallic, metallic * 0.7, metallic * 0.4);
}



24. Circuit Board

// Default parameters: scale=10.0, lineThickness=0.02
fn circuitBoardTexture(uv: vec2<f32>, scale: f32 = 10.0, lineThickness: f32 = 0.02) -> vec3<f32> {
    let grid = fract(uv * scale);
    let lines = step(lineThickness, grid);
    return vec3<f32>(lines.x, lines.y, lines.x * 0.5);
}



25. Carbon Fiber

// Default parameters: scale=10.0, weaveSize=0.1
fn carbonFiberTexture(uv: vec2<f32>, scale: f32 = 10.0, weaveSize: f32 = 0.1) -> vec3<f32> {
    let dist = length(fract(uv * scale) - 0.5);
    return vec3<f32>(step(dist, weaveSize), step(dist, weaveSize) * 0.7, step(dist, weaveSize) * 0.5);
}



26. Brick Wall

// Default parameters: scale=1.0, brickHeight=0.2
fn brickWallTexture(uv: vec2<f32>, scale: f32 = 1.0, brickHeight: f32 = 0.2) -> vec3<f32> {
    let brick = mod(floor(uv.x * scale), 2.0);
    let height = mod(floor(uv.y / brickHeight), 2.0);
    return vec3<f32>(brick, brick * 0.3, height * 0.3);
}



27. Fabric/Weave

// Default parameters: scale=10.0, weaveSize=0.1
fn fabricWeaveTexture(uv: vec2<f32>, scale: f32 = 10.0, weaveSize: f32 = 0.1) -> vec3<f32> {
    let dist = length(fract(uv * scale) - 0.5);
    return vec3<f32>(step(dist, weaveSize), step(dist, weaveSize) * 0.7, step(dist, weaveSize) * 0.5);
}




Procedural Variations




28. Fractal Terrain

// Default parameters: scale=5.0, roughness=0.6
fn fractalTerrainTexture(uv: vec2<f32>, scale: f32 = 5.0, roughness: f32 = 0.6) -> vec3<f32> {
    let noise = fract(sin(dot(uv, vec2<f32>(scale, scale))) * 43758.5453);
    return vec3<f32>(noise * roughness, noise * 0.7, noise * 0.3);
}



29. Gaseous Nebula

// Default parameters: scale=5.0, intensity=0.5
fn gaseousNebulaTexture(uv: vec2<f32>, scale: f32 = 5.0, intensity: f32 = 0.5) -> vec3<f32> {
    let noise = fract(sin(dot(uv, vec2<f32>(scale, scale))) * 43758.5453);
    return vec3<f32>(noise * intensity, noise * 0.8, noise * 0.6);
}



30. Stained Glass

// Default parameters: scale=5.0, colorVariance=0.2
fn stainedGlassTexture(uv: vec2<f32>, scale: f32 = 5.0, colorVariance: f32 = 0.2) -> vec3<f32> {
    let cell = fract(uv * scale);
    return vec3<f32>(cell.x * colorVariance, cell.y * colorVariance, (cell.x + cell.y) * 0.3);
}



31. Lightning

// Default parameters: scale=5.0, jaggedness=1.0
fn lightningTexture(uv: vec2<f32>, scale: f32 = 5.0, jaggedness: f32 = 1.0) -> vec3<f32> {
    let noise = fract(sin(dot(uv, vec2<f32>(scale, scale))) * 43758.5453);
    let lightning = abs(noise - 0.5) * jaggedness;
    return vec3<f32>(lightning, lightning * 0.8, lightning * 0.4);
}



32. Pebble Path

// Default parameters: scale=10.0, pebbleSize=0.1
fn pebblePathTexture(uv: vec2<f32>, scale: f32 = 10.0, pebbleSize: f32 = 0.1) -> vec3<f32> {
    let dist = length(fract(uv * scale) - 0.5);
    return vec3<f32>(step(dist, pebbleSize), 0.6, 0.3);
}



33. Grass

// Default parameters: scale=10.0, bladeHeight=0.5
fn grassTexture(uv: vec2<f32>, scale: f32 = 10.0, bladeHeight: f32 = 0.5) -> vec3<f32> {
    let blade = step(0.2, fract(uv.x * scale)) * bladeHeight;
    return vec3<f32>(0.2, blade * 0.8, 0.2);
}



34. Snowflakes

// Default parameters: scale=5.0, fractalDetail=2.0
fn snowflakeTexture(uv: vec2<f32>, scale: f32 = 5.0, fractalDetail: f32 = 2.0) -> vec3<f32> {
    let noise = fract(sin(dot(uv, vec2<f32>(scale, scale))) * 43758.5453);
    let snowflake = smoothstep(fractalDetail, 1.0, noise);
    return vec3<f32>(snowflake * 0.9, snowflake * 0.9, snowflake * 1.0);
}



35. Wood Bark

// Default parameters: scale=5.0, ridges=5.0
fn woodBarkTexture(uv: vec2<f32>, scale: f32 = 5.0, ridges: f32 = 5.0) -> vec3<f32> {
    let bark = sin(uv.x * scale + uv.y * ridges);
    return vec3<f32>(bark * 0.6 + 0.4, bark * 0.5 + 0.3, bark * 0.3 + 0.2);
}



36. Mandelbrot Set

// Default parameters: scale=5.0, iterations=50
fn mandelbrotSet(uv: vec2<f32>, scale: f32 = 5.0, iterations: f32 = 50.0) -> vec3<f32> {
    let c = uv * scale - 1.0;
    var z = vec2<f32>(0.0, 0.0);
    var count: f32 = 0.0;
    for (var i = 0u; i < iterations; i = i + 1u) {
        z = vec2<f32>(z.x * z.x - z.y * z.y, 2.0 * z.x * z.y) + c;
        if (length(z) > 2.0) {
            break;
        }
        count = count + 1.0;
    }
    return vec3<f32>(count / iterations, count / iterations, count / iterations);
}



37. Julia Set

// Default parameters: scale=1.0, iterations=50
fn juliaSet(uv: vec2<f32>, scale: f32 = 1.0, iterations: f32 = 50.0) -> vec3<f32> {
    let c = vec2<f32>(0.355, 0.355); // Fixed Julia constant
    var z = uv * scale;
    var count: f32 = 0.0;
    for (var i = 0u; i < iterations; i = i + 1u) {
        z = vec2<f32>(z.x * z.x - z.y * z.y, 2.0 * z.x * z.y) + c;
        if (length(z) > 2.0) {
            break;
        }
        count = count + 1.0;
    }
    return vec3<f32>(count / iterations, count / iterations, count / iterations);
}



38. Moire Patterns

// Default parameters: scale=10.0, frequency=5.0
fn moirePatternsTexture(uv: vec2<f32>, scale: f32 = 10.0, frequency: f32 = 5.0) -> vec3<f32> {
    let grid1 = fract(uv * scale);
    let grid2 = fract(uv * scale * frequency);
    let interference = abs(grid1 - grid2);
    return vec3<f32>(interference, interference * 0.5, interference * 0.2);
}



39. Sinusoidal Grids

// Default parameters: scale=10.0, frequency=2.0
fn sinusoidalGridsTexture(uv: vec2<f32>, scale: f32 = 10.0, frequency: f32 = 2.0) -> vec3<f32> {
    let sinX = sin(uv.x * frequency);
    let sinY = sin(uv.y * frequency);
    let grid = abs(sinX + sinY);
    return vec3<f32>(grid, grid * 0.5, grid * 0.2);
}



40. Tiled Fractals

// Default parameters: scale=5.0, fractalDetail=2.0
fn tiledFractalsTexture(uv: vec2<f32>, scale: f32 = 5.0, fractalDetail: f32 = 2.0) -> vec3<f32> {
    let noise = fract(sin(dot(uv, vec2<f32>(scale, scale))) * 43758.5453);
    let fractal = fract(noise * fractalDetail);
    return vec3<f32>(fractal, fractal * 0.7, fractal * 0.5);
}



41. Flow Fields

// Default parameters: scale=10.0, speed=0.1
fn flowFieldsTexture(uv: vec2<f32>, scale: f32 = 10.0, speed: f32 = 0.1) -> vec3<f32> {
    let flow = sin(uv.x * scale + speed * sin(uv.y * scale));
    return vec3<f32>(flow, flow * 0.5, flow * 0.2);
}



42. Ripples

// Default parameters: scale=10.0, waveSpeed=0.5
fn ripplesTexture(uv: vec2<f32>, scale: f32 = 10.0, waveSpeed: f32 = 0.5) -> vec3<f32> {
    let dist = length(uv - 0.5);
    let ripples = sin(dist * scale - waveSpeed);
    return vec3<f32>(ripples * 0.5 + 0.5, ripples * 0.3 + 0.5, ripples * 0.1 + 0.5);
}



43. Pulsing Rings

// Default parameters: scale=10.0, pulseSpeed=1.0
fn pulsingRingsTexture(uv: vec2<f32>, scale: f32 = 10.0, pulseSpeed: f32 = 1.0) -> vec3<f32> {
    let dist = length(uv - 0.5) * scale;
    let pulse = sin(dist - pulseSpeed * sin(dist));
    return vec3<f32>(pulse * 0.5 + 0.5, pulse * 0.3 + 0.5, pulse * 0.2 + 0.5);
}



44. Fading Stripes

// Default parameters: scale=10.0, fadeSpeed=1.0
fn fadingStripesTexture(uv: vec2<f32>, scale: f32 = 10.0, fadeSpeed: f32 = 1.0) -> vec3<f32> {
    let stripes = mod(floor(uv.x * scale), 2.0);
    let fade = smoothstep(0.0, fadeSpeed, sin(uv.y * scale));
    return vec3<f32>(stripes, stripes * fade, stripes * 0.5);
}



45. Morphing Grid

// Default parameters: scale=10.0, time=0.0
fn morphingGridTexture(uv: vec2<f32>, scale: f32 = 10.0, time: f32 = 0.0) -> vec3<f32> {
    let grid = fract(uv * scale + time);
    return vec3<f32>(grid, grid * 0.5, grid * 0.2);
}



46. Rainbow Gradient

// Default parameters: scale=10.0, offset=0.0
fn rainbowGradientTexture(uv: vec2<f32>, scale: f32 = 10.0, offset: f32 = 0.0) -> vec3<f32> {
    let rainbow = mod(uv.x * scale + offset, 1.0);
    return vec3<f32>(rainbow, 1.0 - rainbow, 0.5);
}



47. Heatmap

// Default parameters: scale=10.0, intensity=0.8
fn heatmapTexture(uv: vec2<f32>, scale: f32 = 10.0, intensity: f32 = 0.8) -> vec3<f32> {
    let heat = smoothstep(0.0, intensity, uv.y * scale);
    return vec3<f32>(heat, 0.5, 1.0 - heat);
}



48. Fluorescent Glow

// Default parameters: scale=10.0, glowIntensity=1.0
fn fluorescentGlowTexture(uv: vec2<f32>, scale: f32 = 10.0, glowIntensity: f32 = 1.0) -> vec3<f32> {
    let dist = length(uv - 0.5);
    let glow = smoothstep(0.0, glowIntensity, dist * scale);
    return vec3<f32>(glow, glow * 0.5, glow * 1.0);
}



49. Iridescence

// Default parameters: scale=10.0, filmThickness=0.1
fn iridescenceTexture(uv: vec2<f32>, scale: f32 = 10.0, filmThickness: f32 = 0.1) -> vec3<f32> {
    let dist = length(uv - 0.5) * scale;
    let iridescence = smoothstep(0.0, filmThickness, dist);
    return vec3<f32>(iridescence, iridescence * 0.5, iridescence * 0.7);
}



50. Grayscale Noise

// Default parameters: scale=10.0, intensity=0.5
fn grayscaleNoiseTexture(uv: vec2<f32>, scale: f32 = 10.0, intensity: f32 = 0.5) -> vec3<f32> {
    let noise = fract(sin(dot(uv, vec2<f32>(scale, scale))) * 43758.5453);
    return vec3<f32>(noise * intensity, noise * intensity, noise * intensity);
}



Things to Try


These functions are only the the start of procedural textures - but they provide examples of just how easy it is to create textures instead of loading them from a file.

Some things to try:

• Add more texture types
• Play around with the default parameters (maybe add an interface to control them)
• Mix and combine the textures (e.g., wood with dirt)
• Explore 3D textures - instead of just a 2d uv seed - you can use a 3d seed (extra depth value) - which should represent the changes of the texture as you slice away the layers (think of it like a piece of wood - if you cut away layers of the wood - you'll see the wooden grain texture change)
• Try other color mixes




Resources & Links


• All Texture Generation Examples (LINK)



















101 WebGPU Programming Projects. WebGPU Development Pixels - coding fragment shaders from post processing to ray tracing! WebGPU by Example: Fractals, Image Effects, Ray-Tracing, Procedural Geometry, 2D/3D, Particles, Simulations WebGPU Games WGSL 2d 3d interactive web-based fun learning WebGPU Compute WebGPU API - Owners WebGPU Development Cookbook - coding recipes for all your webgpu needs! WebGPU & WGSL Essentials: A Hands-On Approach to Interactive Graphics, Games, 2D Interfaces, 3D Meshes, Animation, Security and Production Kenwright graphics and animations using the webgpu api 12 week course kenwright learn webgpu api kenwright programming compute and graphics applications with html5 and webgpu api kenwright real-time 3d graphics with webgpu kenwright webgpu for dummies kenwright webgpu wgsl compute graphics all in one kenwright webgpu api develompent a quick start guide kenwright webgpu by example 2022 kenwright webgpu gems kenwright webgpu interactive compute and graphics visualization cookbook kenwright wgsl webgpu shading language cookbook kenwright WebGPU Shader Language Development: Vertex, Fragment, Compute Shaders for Programmers Kenwright WGSL Fundamentals book kenwright WebGPU Data Visualization Cookbook kenwright Special Effects Programming with WebGPU kenwright WebGPU Programming Guide: Interactive Graphics and Compute Programming with WebGPU & WGSL kenwright Ray-Tracing with WebGPU kenwright



 
Advert (Support Website)

 
 Visitor:
Copyright (c) 2002-2026 xbdev.net - All rights reserved.
Designated articles, tutorials and software are the property of their respective owners.