← Back to list
⚡

threejs-postprocessing Checked

Three.js post-processing - EffectComposer, bloom, DOF, screen effects. Use when adding visual eff…
⚡ Productivity skills By calesthio Version v1.0.0 Added 2026-09-07 Updated 2026-09-07 Source ↗
7.7Overall rating
2Views
7Downloads
56.5kStars

Installation

🤖 Install via AI

Copy the prompt below and send it to your AI assistant (e.g. Claude Code) — it will follow the instructions and install automatically.

Install the "threejs-postprocessing" skill by following the instructions at https://skill123.me/install/threejs-postprocessing.
⌨️ Command line install

Run in your terminal — downloads and installs to ~/.claude/skills/.

curl -fsSL https://skill123.me/install/threejs-postprocessing.sh | bash
📦 Download ZIP

Download the zip and extract it into your skills directory (e.g. ~/.claude/skills/), then restart your session.

⬇ Download v1.0.0 · 4 KB
📊 Static rating
7.7/10
Trigger
7.0
Structure
6.7
Workflow
5.6
Content
9.0
Engineering
10.0
Security
10.0

Six-dimension rubric with reviewer rationale.

View scorecard ↓
🛡 Dynamic test
—

Not live-tested yet — this skill is rated on static analysis only.

About this skill

Three.js post-processing - EffectComposer, bloom, DOF, screen effects. Use when adding visual effects, color grading, blur, glow, or creating custom screen-space shaders.

Three.js Post-Processing

Documentation

Three.js post-processing - EffectComposer, bloom, DOF, screen effects. Use when adding visual effects, color grading, blur, glow, or creating custom screen-space shaders.

Three.js Post-Processing

Quick Start


import * as THREE from "three";
import { EffectComposer } from "three/addons/postprocessing/EffectComposer.js";
import { RenderPass } from "three/addons/postprocessing/RenderPass.js";
import { UnrealBloomPass } from "three/addons/postprocessing/UnrealBloomPass.js";

// Setup composer
const composer = new EffectComposer(renderer);

// Render scene
const renderPass = new RenderPass(scene, camera);
composer.addPass(renderPass);

// Add bloom
const bloomPass = new UnrealBloomPass(
  new THREE.Vector2(window.innerWidth, window.innerHeight),
  1.5, // strength
  0.4, // radius
  0.85, // threshold
);
composer.addPass(bloomPass);

// Animation loop - use composer instead of renderer
function animate() {
  requestAnimationFrame(animate);
  composer.render(); // NOT renderer.render()
}

EffectComposer Setup


import { EffectComposer } from "three/addons/postprocessing/EffectComposer.js";
import { RenderPass } from "three/addons/postprocessing/RenderPass.js";

const composer = new EffectComposer(renderer);

// First pass: render scene
const renderPass = new RenderPass(scene, camera);
composer.addPass(renderPass);

// Add more passes...
composer.addPass(effectPass);

// Last pass should render to screen
effectPass.renderToScreen = true; // Default for last pass

// Handle resize
function onResize() {
  const width = window.innerWidth;
  const height = window.innerHeight;

  camera.aspect = width / height;
  camera.updateProjectionMatrix();

  renderer.setSize(width, height);
  composer.setSize(width, height);
}

Common Effects

### Bloom (Glow)


import { UnrealBloomPass } from "three/addons/postprocessing/UnrealBloomPass.js";

const bloomPass = new UnrealBloomPass(
  new THREE.Vector2(window.innerWidth, window.innerHeight),
  1.5, // strength - intensity of glow
  0.4, // radius - spread of glow
  0.85, // threshold - brightness threshold
);

composer.addPass(bloomPass);

// Adjust at runtime
bloomPass.strength = 2.0;
bloomPass.threshold = 0.5;
bloomPass.radius = 0.8;

### Selective Bloom

Apply bloom only to specific objects.


import { UnrealBloomPass } from "three/addons/postprocessing/UnrealBloomPass.js";
import { ShaderPass } from "three/addons/postprocessing/ShaderPass.js";

// Layer setup
const BLOOM_LAYER = 1;
const bloomLayer = new THREE.Layers();
bloomLayer.set(BLOOM_LAYER);

// Mark objects to bloom
glowingMesh.layers.enable(BLOOM_LAYER);

// Dark material for non-blooming objects
const darkMaterial = new THREE.MeshBasicMaterial({ color: 0x000000 });
const materials = {};

function darkenNonBloomed(obj) {
  if (obj.isMesh && !bloomLayer.test(obj.layers)) {
    materials[obj.uuid] = obj.material;
    obj.material = darkMaterial;
  }
}
View full documentation

function restoreMaterial(obj) {

if (materials[obj.uuid]) {

obj.material = materials[obj.uuid];

delete materials[obj.uuid];

}

}

// Custom render loop

function render() {

// Render bloom pass

scene.traverse(darkenNonBloomed);

composer.render();

scene.traverse(restoreMaterial);

// Render final scene over bloom

renderer.render(scene, camera);

}



### FXAA (Anti-Aliasing)

import { ShaderPass } from "three/addons/postprocessing/ShaderPass.js";

import { FXAAShader } from "three/addons/shaders/FXAAShader.js";

const fxaaPass = new ShaderPass(FXAAShader);

fxaaPass.material.uniforms["resolution"].value.set(

1 / window.innerWidth,

1 / window.innerHeight,

);

composer.addPass(fxaaPass);

// Update on resize

function onResize() {

fxaaPass.material.uniforms["resolution"].value.set(

1 / window.innerWidth,

1 / window.innerHeight,

);

}



### SMAA (Better Anti-Aliasing)

import { SMAAPass } from "three/addons/postprocessing/SMAAPass.js";

const smaaPass = new SMAAPass(

window.innerWidth * renderer.getPixelRatio(),

window.innerHeight * renderer.getPixelRatio(),

);

composer.addPass(smaaPass);



### SSAO (Ambient Occlusion)

import { SSAOPass } from "three/addons/postprocessing/SSAOPass.js";

const ssaoPass = new SSAOPass(

scene,

camera,

window.innerWidth,

window.innerHeight,

);

ssaoPass.kernelRadius = 16;

ssaoPass.minDistance = 0.005;

ssaoPass.maxDistance = 0.1;

composer.addPass(ssaoPass);

// Output modes

ssaoPass.output = SSAOPass.OUTPUT.Default;

// SSAOPass.OUTPUT.Default - Final composited output

// SSAOPass.OUTPUT.SSAO - Just the AO

// SSAOPass.OUTPUT.Blur - Blurred AO

// SSAOPass.OUTPUT.Depth - Depth buffer

// SSAOPass.OUTPUT.Normal - Normal buffer



### Depth of Field (DOF)

import { BokehPass } from "three/addons/postprocessing/BokehPass.js";

const bokehPass = new BokehPass(scene, camera, {

focus: 10.0, // Focus distance

aperture: 0.025, // Aperture (smaller = more DOF)

maxblur: 0.01, // Max blur amount

});

composer.addPass(bokehPass);

// Update focus dynamically

bokehPass.uniforms["focus"].value = distanceToTarget;



### Film Grain

import { FilmPass } from "three/addons/postprocessing/FilmPass.js";

const filmPass = new FilmPass(

0.35, // noise intensity

0.5, // scanline intensity

648, // scanline count

false, // grayscale

);

composer.addPass(filmPass);



### Vignette

import { ShaderPass } from "three/addons/postprocessing/ShaderPass.js";

import { VignetteShader } from "three/addons/shaders/VignetteShader.js";

const vignettePass = new ShaderPass(VignetteShader);

vignettePass.uniforms["offset"].value = 1.0; // Vignette size

vignettePass.uniforms["darkness"].value = 1.0; // Vignette intensity

composer.addPass(vignettePass);



### Color Correction

import { ShaderPass } from "three/addons/postprocessing/ShaderPass.js";

import { ColorCorrectionShader } from "three/addons/shaders/ColorCorrectionShader.js";

const colorPass = new ShaderPass(ColorCorrectionShader);

colorPass.uniforms["powRGB"].value = new THREE.Vector3(1.2, 1.2, 1.2); // Power

colorPass.uniforms["mulRGB"].value = new THREE.Vector3(1.0, 1.0, 1.0); // Multiply

composer.addPass(colorPass);



### Gamma Correction

import { GammaCorrectionShader } from "three/addons/shaders/GammaCorrectionShader.js";

const gammaPass = new ShaderPass(GammaCorrectionShader);

composer.addPass(gammaPass);



### Pixelation

import { RenderPixelatedPass } from "three/addons/postprocessing/RenderPixelatedPass.js";

const pixelPass = new RenderPixelatedPass(6, scene, camera); // 6 = pixel size

composer.addPass(pixelPass);



### Glitch Effect

import { GlitchPass } from "three/addons/postprocessing/GlitchPass.js";

const glitchPass = new GlitchPass();

glitchPass.goWild = false; // Continuous glitching

composer.addPass(glitchPass);



### Halftone

import { HalftonePass } from "three/addons/postprocessing/HalftonePass.js";

const halftonePass = new HalftonePass(window.innerWidth, window.innerHeight, {

shape: 1, // 1 = dot, 2 = ellipse, 3 = line, 4 = square

radius: 4, // Dot size

rotateR: Math.PI / 12,

rotateB: (Math.PI / 12) * 2,

rotateG: (Math.PI / 12) * 3,

scatter: 0,

blending: 1,

blendingMode: 1,

greyscale: false,

});

composer.addPass(halftonePass);



### Outline

import { OutlinePass } from "three/addons/postprocessing/OutlinePass.js";

const outlinePass = new OutlinePass(

new THREE.Vector2(window.innerWidth, window.innerHeight),

scene,

camera,

);

outlinePass.edgeStrength = 3;

outlinePass.edgeGlow = 0;

outlinePass.edgeThickness = 1;

outlinePass.pulsePeriod = 0;

outlinePass.visibleEdgeColor.set(0xffffff);

outlinePass.hiddenEdgeColor.set(0x190a05);

// Select objects to outline

outlinePass.selectedObjects = [mesh1, mesh2];

composer.addPass(outlinePass);



## Custom ShaderPass

Create your own post-processing effects.

import { ShaderPass } from "three/addons/postprocessing/ShaderPass.js";

const CustomShader = {

uniforms: {

tDiffuse: { value: null }, // R

Score breakdown

Trigger
7.0
Good What/When with effect keywords like bloom, DOF, color grading, but no When-Not exclusion.
Structure
6.7
602 lines exceeds 500-line guidance with nothing offloaded; no progressive disclosure design.
Workflow
5.6
Topic-organized snippet reference with resize and performance notes, but no workflow or verification loop.
Content
9.0
Accurate modern addons imports, parameterized examples with inline comments, consistent style.
Engineering
10.0
Valid frontmatter; no scripts; See Also sibling references exist.
Security
10.0
Client-side rendering knowledge only; no network, secrets, or injection.
Broad EffectComposer cookbook with correct addons imports, resize handling and performance tips, but a 602-line single-file reference with no offload and no When-Not boundary.