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
相关产品推荐
相关产品推荐

