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加载大量点数据卡顿处理办法 ,检查一下浏览器是否开启独显渲染。

相关推荐
前端小崔11 天前
Three.js 与 Cesium 融合实战问题汇总
前端·three.js·cesium
洛兮银儿11 天前
前端页面引入cesium
前端·cesium
GISBox14 天前
数字孪生项目必备:RVT模型转3DTiles格式的高效解决方案
gis·cesium·格式转换·服务发布·gisbox·rvt切片·3dtiles格式
ToTacview14 天前
Web 可视化卡顿的归因方法论:以“流畅一段、停顿一下“为例的代码级根治
cesium
夜郎king15 天前
基于天地图 Cesium 三维服务实现三维地球及地球自转实践
数据分析·cesium·3d地图·三维地球
luckystar513~17 天前
Navara是WebGIS的第三条路吗?
gis·cesium·mapbox·地图引擎·地理可视化
灵境(虚幻知音)23 天前
WebGL 不支持>1px的线绘制,那 Cesium 的带宽度的线是怎么画出来的?
webgl·cesium·着色器
ToTacview1 个月前
WebGL 没有几何着色器,那 Cesium 的粗线是怎么画出来的?
cesium
用户61595868000221 个月前
Cesium 入门系列(四):区域高亮显示的两种实现方案
cesium
用户61595868000221 个月前
Cesium 入门(三):BaseLayerPicker 底图切换与国产地图接入
cesium