블룸

Bloom

밝은 부분이 주변으로 번져 나오는 후처리 효과. 카메라 렌즈가 강한 빛을 포화시키는 현상을 흉내 냅니다.

다른 이름: GlowUnrealBloomPassEffectComposer
···
js
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';
import { OutputPass } from 'three/addons/postprocessing/OutputPass.js';
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setPixelRatio(Math.min(devicePixelRatio, 2));
document.body.appendChild(renderer.domElement);
const scene = new THREE.Scene();
scene.background = new THREE.Color(0x030308);
const camera = new THREE.PerspectiveCamera(45, 1, 0.1, 100);
camera.position.set(0, 0.5, 6.5);
const core = new THREE.Mesh(new THREE.IcosahedronGeometry(0.9, 1), new THREE.MeshBasicMaterial({ color: 0xffffff }));
scene.add(core);
const ring1 = new THREE.Mesh(new THREE.TorusGeometry(1.9, 0.045, 16, 100), new THREE.MeshBasicMaterial({ color: 0xff3d7a }));
ring1.rotation.x = Math.PI / 2.3;
scene.add(ring1);
const ring2 = new THREE.Mesh(new THREE.TorusGeometry(2.4, 0.03, 16, 100), new THREE.MeshBasicMaterial({ color: 0x3dd6ff }));
ring2.rotation.x = Math.PI / 2.7;
ring2.rotation.y = 0.6;
scene.add(ring2);
const composer = new EffectComposer(renderer);
composer.addPass(new RenderPass(scene, camera));
const bloom = new UnrealBloomPass(new THREE.Vector2(innerWidth, innerHeight), 1.35, 0.75, 0.15);
composer.addPass(bloom);
composer.addPass(new OutputPass());
function resize() {
  renderer.setSize(innerWidth, innerHeight);
  camera.aspect = innerWidth / innerHeight;
  camera.updateProjectionMatrix();
  composer.setSize(innerWidth, innerHeight);
  composer.setPixelRatio(Math.min(devicePixelRatio, 2));
}
addEventListener('resize', resize); resize();
renderer.setAnimationLoop((t) => {
  core.rotation.y = t * 0.0006;
  ring1.rotation.z = t * 0.0004;
  ring2.rotation.z = -t * 0.0003;
  composer.render();
});

블룸은 렌더링이 끝난 화면 전체를 다시 처리하는 후처리(post-processing) 효과입니다. three.js에서는 EffectComposer가 "화면 하나를 렌더 → 다음 패스로 넘김"을 체인처럼 엮는 파이프라인 역할을 합니다: RenderPass(일반 씬 렌더) → UnrealBloomPass(밝은 픽셀만 추출해 흐리고 더함) → OutputPass(색 공간을 화면용으로 되돌림).

UnrealBloomPass(resolution, strength, radius, threshold)의 threshold가 핵심입니다 — 이 밝기보다 어두운 픽셀은 블룸에서 제외됩니다. 그래서 흰색 코어처럼 아주 밝은 물체만 골라서 빛나게 만들 수 있습니다.

데모는 순수한 흰색 MeshBasicMaterial 코어와 채도 높은 두 개의 고리를 회전시킵니다. 코어가 압도적으로 밝아 강하게 번지고, 고리는 은은하게 빛납니다. renderer.render() 대신 composer.render()를 호출하는 걸 잊지 마세요.

언제 쓰나

네온·발광 요소, 게임/제품 쇼케이스의 하이라이트를 강조할 때. 과하면 화면 전체가 뿌예지니 threshold를 꼭 조절하세요.