经纬志
首页 / deck.gl / API 文档

PointLight

先看结论

点光源。由位置定义,光线向四周发散并按距离衰减,适合做路灯、地灯、夜景布光这类局部照明。

最后验证 2026-11-03 · deck.gl 9.0 · 更新 2026-10-29 · 引用本文
new deck.PointLight({ color, intensity, position })

参数

参数默认说明
color[255, 255, 255]RGB 数组,取值 0 到 255
intensity1.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)。