Эффект Bloom используется для имитации свечения
ярких областей сцены, создавая ощущение высокой интенсивности света. В
Three.js его реализует класс UnrealBloomPass, входящий
в модуль postprocessing. Основная задача Bloom — размытие
светлых объектов, чтобы они выглядели более реалистично и насыщенно, при
этом затемнённые части сцены остаются без свечения.
Ключевые моменты Bloom:
Для работы с Bloom необходимо создать сцену с рендерером и добавить постобработку через EffectComposer:
import * as THREE from 'three';
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';
import { UnrealBloomPass } from 'three/examples/jsm/postprocessing/UnrealBloomPass.js';
// Рендерер
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// Сцена и камера
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
camera.position.z = 5;
// Простейшая геометрия
const geometry = new THREE.SphereGeometry(1, 32, 32);
const material = new THREE.MeshBasicMaterial({ color: 0xffff00 });
const sphere = new THREE.Mesh(geometry, material);
scene.add(sphere);
// EffectComposer для постобработки
const composer = new EffectComposer(renderer);
const renderPass = new RenderPass(scene, camera);
composer.addPass(renderPass);
// UnrealBloomPass: параметры (размер экрана, сила, радиус, порог)
const bloomPass = new UnrealBloomPass(
new THREE.Vector2(window.innerWidth, window.innerHeight),
1.5, // strength — интенсивность свечения
0.4, // radius — радиус размытия
0.85 // threshold — порог яркости для свечения
);
composer.addPass(bloomPass);
Описание параметров UnrealBloomPass:
Эффект Bloom применяется через composer.render() вместо
обычного renderer.render(). Это позволяет динамически
изменять параметры и добавлять анимацию сцены:
function animate() {
requestAnimationFrame(animate);
// Поворот объекта
sphere.rotation.x += 0.01;
sphere.rotation.y += 0.01;
// Рендеринг с постобработкой
composer.render();
}
animate();
Для более сложных сцен используется техника маскирования, когда Bloom применяется только к ярким объектам, оставляя остальное без свечения:
Пример подхода:
const darkMaterial = new THREE.MeshBasicMaterial({ color: 'black' });
const materials = {};
// Функция для подготовки маски
function darkenNonBloomed(obj) {
if (obj.isMesh && !obj.userData.bloom) {
materials[obj.uuid] = obj.material;
obj.material = darkMaterial;
}
}
function restoreMaterials(obj) {
if (materials[obj.uuid]) {
obj.material = materials[obj.uuid];
delete materials[obj.uuid];
}
}
// Перед рендерингом Bloom
scene.traverse(darkenNonBloomed);
composer.render();
scene.traverse(restoreMaterials);
В этом случае Bloom будет применён только к объектам, у которых
userData.bloom = true.
bloomPass.materials или использовать цветные
материалы для различных эффектов.threshold, чтобы свечение выглядело естественно
при изменении освещения.Эффект Bloom через UnrealBloomPass в Three.js — мощный инструмент для создания визуально впечатляющих сцен с реалистичным светом и мягкими бликами, позволяющий управлять интенсивностью, радиусом и выборкой объектов с высокой точностью.