pointlight 默认 decay=2(r137+)导致衰减,需显式设 decay=0 以禁用;distance 是衰减终止距离而非开关距离;位置须用 position.set() 设置。spotlight 需绑定场景中的 target 或用 lookat() 定向,angle 和 penumbra 控制光束与柔边。仅 directionallight 和 spotlight 支持阴影,需启用 renderer.shadowmap 并配置 cast/receive 属性。

PointLight 的创建和位置设置容易忽略衰减参数
Three.js 中的 PointLight 默认会随距离衰减,但它的 decay 参数在 r137+ 版本中已默认为 2(模拟物理平方反比衰减),而旧版本默认是 0(无衰减)。如果你发现灯光“突然变暗”或“照不到远处物体”,很可能是衰减行为与预期不符。
实操建议:
- 显式设置
decay:需要物理真实效果时保留decay: 2;想让光均匀覆盖大范围,设为decay: 0 -
distance不是“开关距离”,而是衰减终止距离(超出后光强为 0);若设太小,模型可能完全不被照亮 - 位置必须用
position.set(x, y, z)显式赋值,直接改light.position.x后需调用light.lookAt()或确保场景更新,否则阴影可能错位 - 示例:
const light = new THREE.PointLight(0xffffff, 1, 10, 2);<br>light.position.set(5, 5, 5);<br>scene.add(light);
SpotLight 的角度控制和目标指向常导致光照“偏移”
SpotLight 不像 PointLight 那样以自身为中心发散,它有明确的照射方向和锥角,且依赖 target 对象决定朝向。常见错误是只设了位置,没设置或没正确更新 target,结果光“照向虚空”。
实操建议:
-
angle控制光束张角(单位弧度),penumbra控制边缘柔化程度(0–1),两者共同影响高光过渡——penumbra: 0.2比默认 0 更自然 - 必须将
target加入场景(哪怕只是个空Object3D),否则lookAt()不生效;更稳妥做法是:const target = new THREE.Object3D();<br>target.position.set(0, 0, 0);<br>scene.add(target);<br>spotLight.target = target;
- 移动光源时,别忘了同步更新
target位置,或改用spotLight.lookAt(x, y, z)动态重定向
多个光源共存时容易忽略强度叠加和阴影冲突
Three.js 默认不开启阴影,且 PointLight 不支持阴影(WebGLRenderer 只对 DirectionalLight 和 SpotLight 支持),这点极易踩坑。你加了 3 个 PointLight 却看不到任何阴影,不是代码错了,是根本不能用。
实操建议:
- 启用阴影前,确认渲染器、光源、接收阴影的物体三者都配置正确:
renderer.shadowMap.enabled = true;<br>spotLight.castShadow = true;<br>mesh.receiveShadow = true;<br>mesh.castShadow = true;
-
SpotLight的阴影贴图分辨率(shadow.mapSize.width/height)默认只有 512,复杂场景建议设为 1024 或 2048,否则边缘锯齿严重 - 多个
SpotLight共存时,注意它们的shadow.camera视锥范围(near/far)是否覆盖全部目标区域,否则部分物体会“漏掉阴影”
性能敏感场景下灯光数量和衰减计算的实际开销
每个启用阴影的 SpotLight 都会触发一次额外的 shadow map 渲染 pass,CPU/GPU 开销明显高于 PointLight。移动端或低端设备上,2 个以上带阴影的 SpotLight 就可能导致帧率骤降。
实操建议:
- 非必要不开启阴影:静态场景可用烘焙光照贴图替代;动态物体少时,优先用
PointLight+ 环境光模拟全局照明 - 用
light.intensity替代增加光源数量:一个intensity: 2的SpotLight通常比两个intensity: 1的等效,且省去一次 shadow pass - 调试阶段临时禁用灯光:设置
light.visible = false比移除再添加更快,也避免重新触发材质编译
SpotLight 的 target 必须显式加入场景,以及 PointLight 在新版 Three.js 中的 decay 默认值变化——这两点不查文档几乎不会意识到,但足以让光照表现和预期差很远。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











