开了泛光后整个场景发白
想让夜景灯光有一点辉光,结果整屏像蒙了一层雾,建筑边界全糊了,帧率也掉了三分之一。
现象
打开 viewer.scene.postProcessStages.bloom.enabled = true 之后,
白模、水面、亮色标注全部向外扩散,整体亮度抬高,
暗部细节被压没。关闭后立即恢复。
原因
泛光的阈值由 delta 控制:只有亮度高于 1.0 - delta 的部分才参与辉光。
默认 delta 为 1.0,等于把所有像素都算进高光;再叠加
brightness 默认 0.8 的增益,整幅画面被抬亮。
白模本身接近纯白,是最容易触发过曝的材质;再加上 Cesium 默认不做色调映射, 高亮区域直接截断成白色。
排查过程
先做 A/B 对比:只切换 enabled,其余参数不动,确认问题确实来自这一级。
再把 brightness 设为 0,观察是否仍发白,以排除其他后处理阶段。
var bloom = viewer.scene.postProcessStages.bloom;
console.log(bloom.enabled, bloom.uniforms.brightness, bloom.uniforms.delta);
// true 0.8 1
解决方案
抬高阈值、压低增益,让只有真正的亮部参与辉光:
var bloom = viewer.scene.postProcessStages.bloom;
bloom.enabled = true;
bloom.uniforms.brightness = 0.15;
bloom.uniforms.delta = 0.9; // 只有亮度前 10% 参与
bloom.uniforms.sigma = 3.0;
bloom.uniforms.stepSize = 1.0;
bloom.uniforms.contrast = 128.0;
画面偏灰时配合色调映射,把高光压回可显示范围:
viewer.scene.highDynamicRange = true;
var tonemapping = Cesium.PostProcessStageLibrary.createTonemappingStage();
tonemapping.enabled = true;
viewer.scene.postProcessStages.add(tonemapping);
需要按时间开关(例如只在夜间开灯时启用),不要每帧重建后处理链:
function setNightMode(on) {
viewer.scene.postProcessStages.bloom.enabled = on;
viewer.scene.globe.enableLighting = on;
viewer.scene.requestRender();
}
setNightMode(true);
验证
对比开启前后同一机位的截图,建筑边缘应仍有清晰轮廓, 整体平均亮度变化不超过 10%。性能面板里 GPU 时间增加应控制在 3 ms 以内。
顺序问题:后处理按添加顺序执行。泛光放在色调映射之后,
辉光会被再次压缩而失去效果;放在之前又会过曝。
需要精细控制时,用 postProcessStages.add 明确先后。
经纬志(2026)。《开了泛光后整个场景发白》。https://www.jingweizhi.com/cookbook/cesium-postprocess-black.html(访问日期 2026-11-03)。