Cesium抗锯齿处理

效果前:

效果后:

关键代码:

bash 复制代码
const GLOBAL_ANTIALIASING_MSAA_SAMPLES = 8

class CesiumUtils {
  constructor() {
    this.viewer = null
    // ...
  }

  initViewer(containerId, options = {}) {
    Cesium.Ion.defaultAccessToken = CURRENT_CONFIG.cesiumToken;
    const { globalAntialiasing, ...viewerOptions } = options

    const defaultOptions = {
      msaaSamples: 4,
      // ...
    }

    const finalOptions = {
      ...defaultOptions,
      ...viewerOptions,
      ...this.getGlobalAntialiasingViewerOptions(globalAntialiasing, viewerOptions.msaaSamples),
    }
    this.viewer = new Cesium.Viewer(containerId, finalOptions)
    
    this.setGlobalAntialiasing(globalAntialiasing)
    
    return this.viewer
  }

  getGlobalAntialiasingViewerOptions(enabled, msaaSamples) {
    if (enabled === false) return {}
    const configuredSamples = Number(msaaSamples)
    return {
      msaaSamples: Math.max(
        Number.isFinite(configuredSamples) ? configuredSamples : 1,
        GLOBAL_ANTIALIASING_MSAA_SAMPLES,
      ),
      useBrowserRecommendedResolution: false,
    }
  }

  setGlobalAntialiasing(enabled = true) {
    if (!this.viewer) return

    this.viewer.useBrowserRecommendedResolution = enabled === false
    this.viewer.scene.msaaSamples =
      enabled === false
        ? this.viewer.scene.msaaSamples
        : Math.max(this.viewer.scene.msaaSamples || 1, GLOBAL_ANTIALIASING_MSAA_SAMPLES)

    if (this.viewer.scene.postProcessStages?.fxaa) {
      this.viewer.scene.postProcessStages.fxaa.enabled = enabled !== false
    }
  }
  
}
bash 复制代码
onMounted(async () => {
  await nextTick()
  
  cesiumUtils.destroy()
  
  cesiumUtils.initViewer(CONTAINER_ID, {
    globalAntialiasing: true,  //开启全局抗锯齿
    terrain: { url: DEFAULT_TERRAIN_URL },
    tianditu: 2,
  })
})

注意:

msaaSamples初始值设了4,但实际上只是全局应用fxaa,该处理方法除了给抗锯齿处理加一个开关控制外,还禁止了fxaa全局应用,保留msaa,以部分性能为代价开启高渲染模式。

如果你初始值直接设为8,而不做我上述的处理,则会得到:

如图所示,并没有明显的改变。

据我多年经验,地图的渲染本身就是一个比较吃性能的点,浏览器如果能带起来,那么开启抗锯齿相比地图渲染本身所耗费的性能就比较低微,你可以放心开启。

如果浏览器带起来比较吃力,那么请检查电脑是否具备独显,或是常规模式下不应用独显,请查看我之前的文章 Cesium加载大量点数据卡顿处理办法 ,检查一下浏览器是否开启独显渲染。

相关推荐
REDcker18 小时前
Cesium三维WebGIS入门详解
前端·gis·web·cesium·webgis
用户83134859306982 天前
Cesium 实现行政区内部遮罩
vue.js·webgl·cesium
探索前端2 天前
Cesium图层加载及影像服务添加
前端·cesium
用户83134859306985 天前
Cesium 实现行政区反向遮罩镂空效果(自定义暗色蒙层+矢量/影像底图切换)
vue.js·webgl·cesium
全栈项目管理程序猿6 天前
Cesium 实战 11 - 调整饱和度、对比度等参数,加载渲染美化影像底图
cesium
雨中的小蜗牛9 天前
Cesium实现模型拆解-从底层拓展强行让它和Threejs一样拆解模型
cesium
全栈项目管理程序猿9 天前
Cesium 实战 11 - 调整色调、对比度等参数,加载渲染暗黑底图
cesium
Li.map14 天前
CesiumJS 地图主题系统:用着色器打造实时滤镜
javascript·arcgis·cesium·着色器
全栈项目管理程序猿15 天前
Cesium-1.143 中文版 API
javascript·cesium
用户831348593069818 天前
Cesium自定义可调节星空夜景+星星闪烁
vue.js·cesium