You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cesium加载3DTiles模型时受光照影响亮度不一致如何解决

Cesium 3DTiles不受光照变化影响解决方案

以下方案均无需修改3DTiles源数据,可直接在前端实现:

方案1:修复原有定向光逻辑,固定光照参数

你之前的定向光逻辑将光照方向绑定到相机方向,因此转动视角时光照方向同步变化,才会出现不同角度亮度差异的问题,修改为固定世界坐标方向即可:

// 先关闭所有和时间、视角关联的动态光照效果
viewer.scene.globe.enableLighting = false;
viewer.scene.sun.show = false;
viewer.scene.moon.show = false;

// 设置固定方向、固定强度的定向光
viewer.scene.light = new Cesium.DirectionalLight({
    // 自定义固定世界坐标系下的光照方向,可调整数值匹配你需要的默认亮度效果
    direction: new Cesium.Cartesian3(0.35, -0.5, -0.75),
    intensity: 1.2
});

方案2:自定义3DTiles着色器(最稳妥,完全不受场景光照影响)

如果需要彻底脱离场景光照的约束,无论场景光怎么调整都保持模型原始亮度,直接给3DTiles添加自定义着色器跳过光照计算即可,适配Cesium 1.87及以上版本:

const tileset = viewer.scene.primitives.add(
  new Cesium.Cesium3DTileset({
    url: "你的3DTiles服务地址",
    customShader: new Cesium.CustomShader({
      fragmentShaderText: `
        void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material) {
          // 直接保留模型原始纹理颜色,关闭所有光照相关效果
          material.occlusion = 1.0;
          material.specular = vec3(0.0);
          material.emissive = material.diffuse;
        }
      `,
    }),
  })
);

方案3:低版本Cesium兼容方案

如果使用的Cesium版本不支持CustomShader,可通过样式设置关闭光照影响:

tileset.readyPromise.then(() => {
  tileset.style = new Cesium.Cesium3DTileStyle({
    lightColor: 'rgba(255,255,255,1)'
  });
  tileset.colorBlendMode = Cesium.ColorBlendMode.REPLACE;
});

效果参考图:
正常显示效果:
正常显示截图
异常显示效果:
异常显示截图

内容的提问来源于stack exchange,提问作者chenwwsdo123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:27:03