Cesium 1.91 更新日誌 - MSAA 與原生 Promise 來了


不兼容式更新📣

  • 在下一個版本,也就是 Cesium 1.92,第三方庫 when.js 將被原生 Promise API 代替。Cesium.when 將被廢棄,且於下個版本移除。關於如何升級,請參考下方個人點評,我轉載了官方指導文檔。
  • 修復了當 Scene 沒有渲染時(例如 css 樣式設爲 none)相機對象的獲取射線方法(camera.getPickRay())引發的異常,這個函數會返回 undefined 了。

新增🎉

  • 爲 WebGL 2.0 添加 MSAA(多重採樣抗鋸齒)支持。你可以在創建 Viewer 時傳遞 msaaSamples 選項,也可以用 Scene.msaaSamples 屬性控制。
  • 現在,glTF 模型默認使用 ModelExperimental 架構處理。
  • ModelExpertimental 架構中支持切換背面裁剪。
  • 向 Viewer 和 Scene 類的構造參數中添加 depthPlaneEllipsoidOffset,以解決橢球體平面之下的奇怪渲染問題
  • ModelExperimental 架構中支持了 debugColorTiles
  • ModelExperimental 架構中支持了陰影
  • 在所有的矩陣類中添加了 packArrayunpackArray 方法
  • 爲矩陣類添加一些仿射變換幫助函數
    • Matrix2:setScalesetUniformScalesetRotationgetRotationmultiplyByUniformScale
    • Matrix3:setScalesetUniformScalesetRotationmultiplyByUniformScale
    • Matrix4:setUniformScalesetRotationgetRotationfromRotation
  • AxisAlignedBoundBox 類添加 fromCorners 方法
  • BoundingSphere 類添加 fromTransformation 方法
  • OrientedBoundingBox 類添加 fromTransformationcomputeCOrnerscomputeTransformation 方法
  • Rectangle 類添加 subsection 方法
  • glTF 的版權信息會標註至版權區域
  • 爲 3D Tiles 增加一個選項,它可以決定數據集的版權信息是否顯示在屏幕上
  • 修改了版權排序規則爲出現的頻率

問題修復🔧

  • 修復了使用 ModelExperimental 架構的模型在更新其模型矩陣時不會更新範圍球的錯誤
  • 修復了在 Safari 瀏覽器中 FeatureID 紋理的僞影
  • 修復了使用 ModelExpertimental 架構的不透明模型使用半透明着色器,但是未正確渲染的錯誤

個人點評🖊

① MSAA

MSAA 就不用說了,推薦條件不錯的機器都開,配合 FXAA 提升顯示效果。

const viewer = new Viewer('cesiumContainer', {
  msaaSamples: 4 // 1, 2, 4, 8, 默認 1, 越高效果越好, 也越喫性能
})
viewer.postProcessStages.fxaa.enabled = true

二者有什麼區別?

  • msaa 發生在管線結束前,準確的說是光柵化階段對片元進行多重採樣,輸出到渲染緩衝,然後才繪製到屏幕上
  • fxaa 發生在管線結束後的後處理階段,對渲染的結果進行圖像算法處理

MSAA 在 WebGL 2.0 纔有,WebGPU 原生就支持。目前 WebGPU 尚不成熟,WebGL 2.0 前陣子纔剛剛完全適配所有主流瀏覽器,所以 Cesium 對抗鋸齒效果的 MSAA 功能支持就比較慢。

② 相機獲取射線

獲取射線的函數現在返回值類型發生了改變

const ray = viewer.camera.getPickRay() // Ray 或 undefined

③ ModelExperimental

即實驗中的 Model,是對原有 Model 類的架構升級,這是爲了適配更強大的 glTF,以及爲下一代 3D Tiles 準備的。

預計 2022 年這個新架構會轉正。

④ 逐漸 ES6

細心的朋友也許觀察到了,源代碼已經把 var 切換至 let/const 聲明變量了。在下一個版本(1.92),CesiumJS 有計劃地將第三方異步庫 when.js 替換爲 ES6 原生 Promise 實現。不過,距離源代碼完全使用 async/await 估計還有一段路要走。

關於遷移 Cesium.when,官方是這麼說的:

  • 移除所有使用了 Cesium.when 的代碼
  • Cesium.defer 代替了 when.defer
  • Promise.all 代替了 when.join
  • 在 Promise 鏈式調用中,catch 代替了 otherwisefinally 代替了 always;如果你用 async/await 而不是 Promise 鏈,那這裏不需要改變

除此之外,還希望官方團隊完成 ES6 的 class、模板字符串的轉換。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章