pmndrs/postprocessing example
by Matt
HTML
<base href="https://rawcdn.githack.com/mrdoob/three.js/r156/examples/" />
<script async src="https://cdn.jsdelivr.net/npm/[email protected]/dist/es-module-shims.js"></script>
<script type="importmap">
{
"imports": {
"three": "https://cdn.jsdelivr.net/npm/[email protected]/build/three.module.js",
"three/addons/": "https://cdn.jsdelivr.net/npm/[email protected]/examples/jsm/",
"lil-gui": "https://cdn.jsdelivr.net/npm/[email protected]/dist/lil-gui.esm.min.js",
"postprocessing": "https://cdn.jsdelivr.net/npm/[email protected]/build/index.js"
}
}
</script>
CSS
canvas {
position: fixed;
inset: 0;
}
JavaScript
import * as THREE from 'three'
import { OrbitControls } from 'three/addons/controls/OrbitControls.js'
import { GUI } from 'lil-gui'
import { BloomEffect, EffectComposer, EffectPass, RenderPass, VignetteEffect } from "postprocessing";
let scene, camera, renderer, composer
let mesh, orbitControls, clock
let params
init().then(animate)
async function init() {
params = {
speed: 1
}
scene = new THREE.Scene()
scene.background = new THREE.Color('skyblue')
camera = new THREE.PerspectiveCamera(75, undefined, 0.1, 1000)
camera.position.set(1, 2, 3)
clock = new THREE.Clock()
const directionalLight = new THREE.DirectionalLight('white', Math.PI)
directionalLight.position.set(2, 3, 4)
scene.add(directionalLight)
const ambientLight = new THREE.AmbientLight('white', 0.3 * Math.PI)
scene.add(ambientLight)
renderer = new THREE.WebGLRenderer({ antialias: true })
document.body.appendChild(renderer.domElement)
composer = new EffectComposer(
renderer,
{ frameBufferType: THREE.HalfFloatType } // https://github.com/mrdoob/three.js/issues/24002
);
composer.addPass(new RenderPass(scene, camera));
composer.addPass(new EffectPass(camera,
new BloomEffect({ luminanceThreshold: 1, luminanceSmoothing: 0.5, mipmapBlur: true }),
new VignetteEffect()
));
orbitControls = new OrbitControls(camera, renderer.domElement)
const geometry = new THREE.BoxGeometry()
const material = new THREE.MeshStandardMaterial({ emissive: 'white' })
mesh = new THREE.Mesh(geometry, material)
scene.add(mesh)
const gui = new GUI()
gui.add(material, 'emissiveIntensity').step(0.1).min(0).max(2)
onWindowResize()
window.addEventListener('resize', onWindowResize, false)
}
function animate() {
const dt = clock.getDelta()
orbitControls.update()
mesh.rotation.x = mesh.rotation.y += dt * params.speed
composer.render(scene, camera)
requestAnimationFrame(animate)
}
function onWindowResize() {
camera.aspect = window.innerWidth /...