환경 맵

Environment map

주변 공간을 담은 텍스처로 물체를 비추고 반사시키는 기법. 사실적인 반사와 조명을 한 번에 해결합니다.

다른 이름: IBLImage-Based LightingPMREMGeneratorRoomEnvironment
···
js
import * as THREE from 'three';
import { RoomEnvironment } from 'three/addons/environments/RoomEnvironment.js';
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setPixelRatio(Math.min(devicePixelRatio, 2));
document.body.appendChild(renderer.domElement);
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(45, 1, 0.1, 100);
camera.position.set(0, 0.6, 6);
const pmrem = new THREE.PMREMGenerator(renderer);
const envTex = pmrem.fromScene(new RoomEnvironment(), 0.04).texture;
scene.environment = envTex;
scene.background = envTex;
scene.backgroundBlurriness = 0.35;
const group = new THREE.Group();
const knot = new THREE.Mesh(
  new THREE.TorusKnotGeometry(1.05, 0.34, 180, 24),
  new THREE.MeshStandardMaterial({ color: 0xffffff, metalness: 1, roughness: 0.12 })
);
group.add(knot);
scene.add(group);
function resize() { renderer.setSize(innerWidth, innerHeight); camera.aspect = innerWidth / innerHeight; camera.updateProjectionMatrix(); }
addEventListener('resize', resize); resize();
renderer.setAnimationLoop((t) => {
  group.rotation.y = t * 0.00028;
  group.rotation.x = Math.sin(t * 0.00018) * 0.25;
  renderer.render(scene, camera);
});

HDRI 파노라마 이미지를 scene.environment로 넣으면 모든 PBR 머티리얼이 그 공간을 비추듯 반사·조명됩니다(Image-Based Lighting). 이 사이트는 외부 이미지 파일을 못 쓰므로, three.js 애드온의 RoomEnvironment(가상의 방 하나를 절차적으로 만든 Scene)를 PMREMGenerator에 넣어 그 자리에서 환경 텍스처를 구워냅니다.

PMREMGenerator는 그 씬을 여러 흐림 정도로 미리 컨볼루션해서(Prefiltered Mipmapped Radiance Environment Map) 거친 재질일수록 더 흐린 반사가 자동으로 나오게 만듭니다 — 그래서 roughness가 달라도 매 프레임 다시 계산할 필요가 없습니다.

scene.environment는 반사·조명에만 쓰고, scene.background에 같은 텍스처를 넣으면 눈에 보이는 배경으로도 씁니다. 데모에서는 완전히 매끈한 금속 토러스노트를 이 환경 속에 두어 반사가 표면을 타고 흐르는 걸 보여줍니다.

언제 쓰나

금속·유리 등 반사가 중요한 재질을 실사처럼 보여줄 때. 실제 HDRI를 쓸 수 있으면 더 사실적입니다.