经纬志
首页 / three.js / API 文档

Light

先看结论

光源基类,提供颜色、强度与阴影配置;具体照明行为由子类决定。

最后验证 2026-11-03 · three.js 0.160.0 · 更新 2026-10-27 · 引用本文
new THREE.Light(color, intensity) → Light

基类属性

属性默认说明
color0xffffff光色,用 Color 对象读写
intensity1强度。不同类型单位不同,见下文
castShadowfalse是否投射阴影,聚光灯与点光源开销更高
shadow—阴影配置对象,包含 mapSize、camera、bias 等
visibletrue为 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)。