Light
光源基类,提供颜色、强度与阴影配置;具体照明行为由子类决定。
基类属性
| 属性 | 默认 | 说明 |
|---|---|---|
color | 0xffffff | 光色,用 Color 对象读写 |
intensity | 1 | 强度。不同类型单位不同,见下文 |
castShadow | false | 是否投射阴影,聚光灯与点光源开销更高 |
shadow | — | 阴影配置对象,包含 mapSize、camera、bias 等 |
visible | true | 为 false 时该光源不参与渲染 |
子类
| 子类 | 构造 | 特点 |
|---|---|---|
AmbientLight |
(color, intensity) |
均匀照亮所有表面,不产生方向与阴影 |
HemisphereLight |
(skyColor, groundColor, intensity) |
上方天空色、下方地面色,法线朝上的面偏天空色 |
DirectionalLight |
(color, intensity) |
平行光,位置与 target 决定方向,不随距离衰减 |
PointLight |
(color, intensity, distance, decay) |
点光源,向四周发光,随距离衰减 |
SpotLight |
(color, intensity, distance, angle, penumbra, decay) |
锥形光,angle 为半角,penumbra 控制边缘柔化 |
RectAreaLight |
(color, intensity, width, height) |
面光源,只对 Standard / Physical 材质生效 |
平行光与阴影
const sun = new THREE.DirectionalLight(0xfff0d8, 2.4);
sun.position.set(20, 30, 12);
// 平行光的方向由「位置 → target」决定,target 默认在原点
sun.target.position.set(0, 0, 0);
scene.add(sun.target);
sun.castShadow = true;
sun.shadow.mapSize.set(2048, 2048);
// 阴影相机是正交相机,范围要贴合实际场景
sun.shadow.camera.left = -40;
sun.shadow.camera.right = 40;
sun.shadow.camera.top = 40;
sun.shadow.camera.bottom = -40;
sun.shadow.camera.near = 1;
sun.shadow.camera.far = 120;
sun.shadow.bias = -0.0005;
sun.shadow.normalBias = 0.02;
scene.add(sun);
normalBias 对斜面特别有效,能减轻阴影贴在表面上的条纹。
bias 调得过大,阴影会脱离物体(彼得潘效应),两者要一起试。
点光源与聚光灯的距离衰减
从 r155 起默认使用物理光照单位。decay = 2 表示亮度按距离平方衰减,
distance = 0 表示不限制传播距离。实际使用中,点光源强度常见为几十到几百,
和平行光的 1 到 3 不是一个量级。
const lamp = new THREE.PointLight(0xffd7a8, 60, 18, 2);
lamp.position.set(3, 4.5, 0);
scene.add(lamp);
const spot = new THREE.SpotLight(0xffffff, 90, 40, Math.PI / 7, 0.4, 2);
spot.position.set(0, 12, 6);
spot.target.position.set(0, 0, 0);
scene.add(spot, spot.target);
点光源与聚光灯的阴影是六个面或一个视锥的深度图,开销量级明显高于平行光。 场景里同时开启多个点光源阴影,会很快吃掉帧预算。
环境光的正确用法
AmbientLight 只做整体提亮,不产生立体感。用它压住死黑,
再用主光塑造明暗,是简单有效的组合。对于室外场景,
HemisphereLight 通常比纯环境光更自然,因为地面反射的光会带一点地面色。
PBR 材质在完全无环境贴图、只有环境光时,金属表面会显得很暗。 需要金属质感时,补一张环境贴图比继续加光更有效。
面光源的前置条件
RectAreaLight 需要引入 addons 里的
RectAreaLightUniformsLib 并调用一次 init(),
否则材质上不会出现照明效果。它不支持阴影,适合做柔和的产品展示与室内补光。
光源数量直接影响材质编译。每个受光材质都要为当前光源组合编译着色器。
动态增删光源会触发重编译,造成卡顿。场景的光源配置最好在初始化时定好,
切换时用 visible 或调强度,而不是反复增删。
经纬志(2026)。《Light》。https://www.jingweizhi.com/three/api/light.html(访问日期 2026-11-03)。