不兼容式更新📣
- 在下一個版本,也就是 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
架構中支持了陰影 - 在所有的矩陣類中添加了
packArray
和unpackArray
方法 - 爲矩陣類添加一些仿射變換幫助函數
- Matrix2:
setScale
、setUniformScale
、setRotation
、getRotation
、multiplyByUniformScale
- Matrix3:
setScale
、setUniformScale
、setRotation
、multiplyByUniformScale
- Matrix4:
setUniformScale
、setRotation
、getRotation
、fromRotation
- Matrix2:
- 爲
AxisAlignedBoundBox
類添加fromCorners
方法 - 爲
BoundingSphere
類添加fromTransformation
方法 - 爲
OrientedBoundingBox
類添加fromTransformation
、computeCOrners
、computeTransformation
方法 - 爲
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
代替了otherwise
,finally
代替了always
;如果你用async/await
而不是 Promise 鏈,那這裏不需要改變
除此之外,還希望官方團隊完成 ES6 的 class、模板字符串的轉換。