LightProbe в Three.js используется для реализации реалистичного освещения сцены на основе данных о световой среде. Этот тип освещения позволяет объектам реагировать на окружающее световое поле, создавая эффект, приближенный к физически корректному.
LightProbe фиксирует информацию о световой среде в виде сферы коэффициентов сферической гармоники (Spherical Harmonics, SH). Эти коэффициенты кодируют распределение света с разных направлений, что обеспечивает мягкое, диффузное освещение, без необходимости устанавливать отдельные источники света для каждой области сцены.
import * as THREE from 'three';
// Создание LightProbe
const lightProbe = new THREE.LightProbe();
// Настройка сферической гармоники вручную (пример)
lightProbe.sh.fromArray([
0.8, 0.7, 0.6, // L00
0.1, 0.1, 0.1, // L1-1
0.2, 0.2, 0.2, // L10
0.3, 0.3, 0.3 // L11
]);
scene.add(lightProbe);
Ключевые моменты:
Освещение на основе окружения (Image-Based Lighting, IBL) позволяет
сцене реагировать на изображения окружающей среды. В
Three.js используется CubeTexture или HDR-карты в
формате .hdr или .exr. Эти текстуры могут быть
преобразованы в LightProbe с помощью
LightProbeGenerator.fromCubeTexture().
import { LightProbeGenerator } from 'three/examples/jsm/lights/LightProbeGenerator.js';
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';
new RGBELoader().load('path/to/hdr.hdr', function(texture) {
texture.mapping = THREE.EquirectangularReflectionMapping;
// Генерация LightProbe из HDR-карты
const lightProbe = LightProbeGenerator.fromCubeTexture(texture);
scene.add(lightProbe);
// Присвоение HDR-карты как environment для сцены
scene.environment = texture;
});
Особенности:
scene.environment используется материалами
MeshStandardMaterial и MeshPhysicalMaterial
для отражений и диффузного освещения.Материалы PBR (Physically Based Rendering) в Three.js используют диффузное освещение, отражения и F0-параметры металличности. LightProbe обеспечивает реалистичное отражение диффузного света на объектах, без необходимости вручную расставлять источники света.
const material = new THREE.MeshStandardMaterial({
color: 0xffffff,
metalness: 0.5,
roughness: 0.3
});
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
Эффект IBL:
scene.environment.Для динамических сцен можно обновлять LightProbe в реальном времени. Например, при изменении HDRI или позиционировании объекта относительно источников света.
// Обновление LightProbe при смене окружающей карты
lightProbe.sh.fromArray(newSHCoefficients);
Замечания по производительности:
scene.environment вместе с IBL, так как LightProbe отражает
только диффузный компонент.LightProbe и IBL в Three.js создают основу для реалистичного PBR-рендеринга, где свет не моделируется вручную, а берется из реальной среды, что упрощает создание сложных и естественных сцен.