Environment map (окружающая карта) — это текстура, которая моделирует
отражения окружающей среды на поверхности объектов. В Three.js она
используется для создания реалистичных визуальных эффектов, особенно при
работе с PBR-материалами (MeshStandardMaterial и
MeshPhysicalMaterial). Карта окружения позволяет
имитировать отражение неба, зданий, предметов и других источников света
без необходимости сложного рендеринга глобального освещения.
Three.js поддерживает несколько форматов environment map:
Использование environment map особенно важно для PBR-материалов,
поскольку они рассчитывают отражения и освещение на основе физически
корректных моделей. Без карты окружения объекты будут выглядеть плоско,
даже если настроены все параметры metalness и
roughness.
Для работы с CubeTexture используется
THREE.CubeTextureLoader:
const loader = new THREE.CubeTextureLoader();
const envMap = loader.load([
'px.jpg', 'nx.jpg',
'py.jpg', 'ny.jpg',
'pz.jpg', 'nz.jpg'
]);
scene.background = envMap;
scene.environment = envMap;
Параметр scene.environment определяет источник отражений
для PBR-материалов. Если указать только scene.background,
карта будет видна в качестве фона, но объекты не будут отражать её.
Для equirectangular-карт используется
THREE.TextureLoader с конвертацией через
THREE.EquirectangularReflectionMapping:
const loader = new THREE.TextureLoader();
loader.load('hdr_sky.jpg', function(texture) {
texture.mapping = THREE.EquirectangularReflectionMapping;
scene.background = texture;
scene.environment = texture;
});
PBR-материалы в Three.js (MeshStandardMaterial,
MeshPhysicalMaterial) используют параметры
metalness и roughness для моделирования
взаимодействия с окружающим светом.
Environment map напрямую влияет на визуальный эффект этих параметров.
Без карты отражения будут отсутствовать, и металлические поверхности
будут выглядеть тускло. Карта окружения также корректно взаимодействует
с физически корректным освещением
(physicallyCorrectLights), усиливая реализм сцены.
const material = new THREE.MeshStandardMaterial({
metalness: 0.9,
roughness: 0.2,
envMap: envMap
});
const sphere = new THREE.Mesh(new THREE.SphereGeometry(1, 64, 64), material);
scene.add(sphere);
PMREMGenerator. Он создаёт предварительно фильтрованные
карты, которые обеспечивают корректные размытие отражений в зависимости
от шероховатости материала:const pmremGenerator = new THREE.PMREMGenerator(renderer);
pmremGenerator.compileEquirectangularShader();
loader.load('hdr_sky.hdr', function(texture) {
const envMap = pmremGenerator.fromEquirectangular(texture).texture;
scene.environment = envMap;
texture.dispose();
pmremGenerator.dispose();
});
Отделение фона и отражений Иногда необходимо
использовать карту только для отражений, оставляя фон прозрачным или
отдельным. В этом случае scene.background остаётся
null, а scene.environment устанавливается в
карту окружения.
Производительность CubeTexture с низким разрешением ускоряет рендеринг, но уменьшает качество отражений. Для крупных сцен рекомендуется использовать разные уровни детализации карт окружения, особенно при динамических объектах.
PMREMGenerator автоматически создаёт mip-уровни для
размытия отражений на шероховатых поверхностях.envMapIntensity у PBR-материалов, что позволяет
регулировать яркость отражений без изменения самой карты.scene.environment на лету для имитации смены освещения и
времени суток.Environment map является критически важным элементом для достижения реализма в PBR-материалах. Правильная настройка отражений и использования HDR-текстур позволяет создавать сцены с глубиной, где металл и стекло выглядят натурально, а освещение взаимодействует с поверхностями предсказуемо и физически корректно.