Utilities

  • 04boilerplateFree
  • 02color
  • 01noise
  • 12postprocessing
  • 06patterns
  • 03distortion
  • 02sdf
  • 06function
  • 04interactivityNew

Enroll in Fragments ↵

Sketch Component

Template React component for building creative coding sketches with Three.js and TSL. Copy, paste, start creating.

Loading...
Color Space Correction→
←→

Sketch Component142

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
Sketches142Writing27

Fragments

Learn creative coding with shaders. For design engineers, creative coders and shader artists: techniques, tools, deep dives. Powered by ThreeJS and TSL.

Loading...

2025 Phobon

phobon.io↗Shadercraft↗

Pages

Home↗Techniques↗Utilities↗Breakdowns↗Sketches↗Writing↗

Contact

X @thenoumenon↗hey@fragments.supply↗OKAY DEV @phobon↗
All rights reserved.

What is a Sketch Component?

These are components built specifically to get you up and running with Three.JS, TSL and either React Three Fiber (R3F) or vanilla Three.js. They have some default uniforms and settings that are useful for quick iteration and development using your Boilerplate Project.

Under the hood, it uses a transparent MeshBasicNodeMaterial to render the sketch to the size of the viewport (as defined by your camera).

How to use it

These are components that can be used in any R3F or vanilla Three.js project, but ideal to use with your Boilerplate Project.

React Three Fiber (R3F)

An example using the WebGPUSketch component
import { WebGPUSketch } from '@/components/sketch/webgpu_sketch'
import { Fn, vec3, screenSize, uv } from 'three/tsl'
 
// This is a simple placeholder node that outputs uv coordinate colors to the screen
const sketchNode = Fn(() => {
  const finalColor = vec3(uv(), 1.0)
  return finalColor
})
 
export const Sketch = () => {
  // The `Fn` tsl function is used to create a node that can be used in this component
  // It's technically a function, so it needs to be called to instantiate it
  return <WebGPUSketch colorNode={sketchNode()} />
}

In your R3F project, you can use the WebGPUSketch component.

Using the WebGPUSketch component in a scene
import { Sketch } from './sketch'
 
export const Scene = () => {
  return (
    <Canvas>
      <Sketch />
    </Canvas>
  )
}

onFrame Callback

This sketch provides an onFrame callback that can be used to update the sketch from R3F's useFrame hook.

Using the onFrame callback
import { WebGPUSketch } from '@/components/sketch/webgpu_sketch'
import { Fn, vec3, screenSize, uv } from 'three/tsl'
 
const sketchNode = Fn(() => {
  const finalColor = vec3(uv(), 1.0)
  return finalColor
})
 
const myUniform = uniform(0.0)
 
// Note that the `onFrame` callback is called every frame, so you need to be careful with the performance of your sketch.
const onFrame = (node, state) => {
  // Do something with your node, or using R3F's full state
  myUniform.value += state.clock.getElapsedTime()
}
 
export const Sketch = () => {
  return <WebGPUSketch colorNode={sketchNode()} onFrame={onFrame} />
}

Keep in mind that this is not really the way that we'd update a time uniform in TSL, as it provides a time node by default.

Vanilla Three.js

In vanilla Three.js, the sketch component is a little bit different in that it contains the entire scene, and all of the logic for rendering the sketch itself.

Using the onFrame callback in vanilla Three.js
import WebGPUSketch from '@/components/sketch/webgpu_sketch'
import { Fn, vec3, screenSize, uv } from 'three/tsl'
 
const canvas = document.querySelector('#webgpu-canvas')
 
// This is a simple placeholder node that outputs uv coordinate colors to the screen
const sketchNode = Fn(() => {
  const finalColor = vec3(uv(), 1.0)
  return finalColor
})
 
// Note - call your colorNode at this point
const sketch = new WebGPUSketch(canvas, sketchNode())
sketch.init()
 
// Kick off the render loop for the sketch (creates its own render loop)
sketch.render()

onFrame Callback

The onFrame callback is available in vanilla Three.js as well:

Using the onFrame callback in vanilla Three.js
import WebGPUSketch from '@/components/sketch/webgpu_sketch'
import { Fn, vec3, screenSize, uv } from 'three/tsl'
 
const canvas = document.querySelector('#webgpu-canvas')
 
// This is a simple placeholder node that outputs uv coordinate colors to the screen
const sketchNode = Fn(() => {
  const finalColor = vec3(uv(), 1.0)
  return finalColor
})
 
const myUniform = uniform(0.0)
const onFrame = (node, _gl) => {
  // Do something with your node
  myUniform.value += 0.1
}
 
const sketch = new WebGPUSketch(canvas, sketchNode(), onFrame)
sketch.init()
 
// Kick off the render loop for the sketch (creates its own render loop)
sketch.render()

Implementation Reference

React Three Fiber (R3F)

Vanilla Three.js

Links to additional resources

  • Three.js
  • Three.js Shading Language
  • React Three Fiber
Genuary 1

Genuary 1

Genuary 2

Genuary 2

Genuary 3

Genuary 3

Genuary 4

Genuary 4

Genuary 5

Genuary 5

Genuary 6

Genuary 6

Genuary 8

Genuary 8

Genuary 9

Genuary 9

Genuary 10

Genuary 10

Genuary 11

Genuary 11

Genuary 12

Genuary 12

Genuary 13

Genuary 13

Genuary 14

Genuary 14

Genuary 15

Genuary 15

Genuary 16

Genuary 16

Genuary 17

Genuary 17

Genuary 18

Genuary 18

Genuary 19

Genuary 19

Genuary 20

Genuary 20

Genuary 22

Genuary 22

Genuary 23

Genuary 23

Genuary 24

Genuary 24

Genuary 25

Genuary 25

Genuary 26

Genuary 26

Genuary 27

Genuary 27

Genuary 28

Genuary 28

Genuary 29

Genuary 29

Genuary 30

Genuary 30

Genuary 31

Genuary 31

Flare 1

Flare 1

Free
Flare 2

Flare 2

Flare 3

Flare 3

Flare 4

Flare 4

Flare 5

Flare 5

Flare 6

Flare 6

Flare 7

Flare 7

Flare 8

Flare 8

Flare 9

Flare 9

Eidolon 1

Eidolon 1

Eidolon 2

Eidolon 2

Eidolon 3

Eidolon 3

Eidolon 4

Eidolon 4

Eidolon 5

Eidolon 5

Dawn 1

Dawn 1

Free
Dawn 2

Dawn 2

Dawn 3

Dawn 3

Dawn 4

Dawn 4

Dawn 5

Dawn 5

Arcs 1

Arcs 1

Arcs 2

Arcs 2

Arcs 3

Arcs 3

Arcs 4

Arcs 4

Arcs 5

Arcs 5

Arcs 6

Arcs 6

Imaginary 1

Imaginary 1

Imaginary 2

Imaginary 2

Imaginary 3

Imaginary 3

Imaginary 4

Imaginary 4

Imaginary 5

Imaginary 5

Imaginary 6

Imaginary 6

Imaginary 7

Imaginary 7

Imaginary 8

Imaginary 8

Mesh 7

Mesh 7

Mesh 8

Mesh 8

Fundament

Fundament

Cellular

Cellular

Network

Network

Spiral

Spiral

Monde

Monde

Concentric

Concentric

Flow

Flow

Shift 1

Shift 1

Shift 2

Shift 2

Shift 3

Shift 3

Shift 4

Shift 4

Shift 5

Shift 5

Shift 6

Shift 6

Shift 7

Shift 7

Shift 8

Shift 8

Cascade 1

Cascade 1

Cascade 2

Cascade 2

Cascade 3

Cascade 3

Cascade 4

Cascade 4

Cascade 5

Cascade 5

Cascade 6

Cascade 6

Cascade 7

Cascade 7

Cascade 8

Cascade 8

Cascade 9

Cascade 9

Cascade 10

Cascade 10

Abiogenic 1

Abiogenic 1

Abiogenic 2

Abiogenic 2

Abiogenic 3

Abiogenic 3

Abiogenic 4

Abiogenic 4

Abiogenic 5

Abiogenic 5

Warp 1

Warp 1

Warp 2

Warp 2

Warp 3

Warp 3

Warp 4

Warp 4

Warp 5

Warp 5

Gravity 1

Gravity 1

Gravity 2

Gravity 2

Gravity 3

Gravity 3

Gravity 4

Gravity 4

Gravity 5

Gravity 5

Gravity 6

Gravity 6

Gravity 7

Gravity 7

Gravity 8

Gravity 8

Gravity 9

Gravity 9

Gravity 10

Gravity 10

Slate 1

Slate 1

Slate 2

Slate 2

Slate 3

Slate 3

Slate 4

Slate 4

Slate 5

Slate 5

Bands 1

Bands 1

Bands 2

Bands 2

Bands 3

Bands 3

Bands 4

Bands 4

Bands 5

Bands 5

Bands 6

Bands 6

Bands 7

Bands 7

Genuary 1

Genuary 1

Genuary 2

Genuary 2

Genuary 3

Genuary 3

Genuary 4

Genuary 4

Genuary 5

Genuary 5

Genuary 6

Genuary 6

Genuary 7

Genuary 7

Genuary 8

Genuary 8

Genuary 9

Genuary 9

Genuary 12

Genuary 12

Genuary 13

Genuary 13

Genuary 14

Genuary 14

Genuary 17

Genuary 17

Genuary 19

Genuary 19

Genuary 20

Genuary 20

Genuary 21

Genuary 21

Genuary 23

Genuary 23

Genuary 24

Genuary 24

Genuary 25

Genuary 25

Genuary 27

Genuary 27

Genuary 30

Genuary 30

Be the first to know what's next