首页 / deck.gl / API 文档
PointLight
先看结论
点光源。由位置定义,光线向四周发散并按距离衰减,适合做路灯、地灯、夜景布光这类局部照明。
new deck.PointLight({ color, intensity, position })
参数
| 参数 | 默认 | 说明 |
|---|---|---|
color | [255, 255, 255] | RGB 数组,取值 0 到 255 |
intensity | 1.0 | 强度倍率 |
position | — | 光源位置,世界坐标下的 [x, y, z] |
属性
| 属性 | 说明 |
|---|---|
color | 光的颜色 |
intensity | 强度 |
position | 位置 |
type | 恒为 'point' |
示例:夜间街区
var lightingEffect = new deck.LightingEffect({
ambientLight: new deck.AmbientLight({
color: [40, 52, 86],
intensity: 0.7
}),
directionalLights: [
new deck.DirectionalLight({
color: [90, 110, 170],
intensity: 0.5,
direction: [2, -6, -1]
})
],
pointLights: [
new deck.PointLight({
color: [255, 214, 140],
intensity: 6,
position: [12958190, 4826000, 60]
}),
new deck.PointLight({
color: [255, 190, 110],
intensity: 4,
position: [12958500, 4824200, 40]
})
]
});
position 用哪个坐标系
光源坐标与图层的 coordinateSystem 相关。默认的
COORDINATE_SYSTEM.LNGLAT 下,位置直接写经纬度与高度;
使用 METER_OFFSETS 或 CARTESIAN 时,
要按对应的平面坐标或世界坐标给出。位置与图层坐标系不匹配,
光会落在场景外,表现为所有面一样暗。
强度为什么需要很大
点光源按距离平方衰减,几十米的距离就会让亮度掉一个数量级。
因此 intensity 常写成 4 到 10,而不是像平行光那样接近 1。
光源抬得越高,覆盖范围越大,但每个面的亮度越低。
v9 的不可变更新
lightingEffect.pointLights 可以整体替换为新数组,
但 deck.gl 9 中图层实例不可变。要让新的光照参与绘制,
clone 图层后再调用 deckgl.setProps:
lightingEffect.pointLights = [lampA, lampB, lampC];
deckgl.setProps({
effects: [lightingEffect],
layers: deckgl.props.layers.map(function (l) { return l.clone({}); })
});
点光源越多越慢。每盏光都会进入片元着色器的循环,
几十盏就会明显拖低帧率。夜景里需要大量灯位时,用颜色贴图或发光层模拟,
真正的 PointLight 只保留离视点最近的几盏。
经纬志(2026)。《PointLight》。https://www.jingweizhi.com/deckgl/api/point-light.html(访问日期 2026-11-03)。