近一年來再次重大更新:Cesium 1.83 來了

概覽

動態地形誇大過傾光線時陰影漸隱效果增加 KTX2 和 Basis Universal 紋理格式的支持、自定義高程提供器、3D-Tiles 擴展檢查機制

提供 Windows *臺外邊線無效的提示文檔

修復舊式 tileset 頂級瓦片無幾何誤差的錯誤、修復相機互操作問題、修復後處理異常和閃屏問題

更新部分文字性描述(文檔類)

終結 IE11 的支持:1.83 是最後一個支持 IE11 的版本。

破壞式更新 📣

  • 不再支持 KTX1 和 Crunch 紋理;使用 ktx2ktx2 升級 ktx1 文件

功能新增 🎉

  • 新增 動態地形誇大功能,見 Globe.terrainExaggerationGlobe.terrainExaggerationRelativeHeight

    此更新是自 2015 年以來的再次優化。前者是誇大的倍數,後者是向上向下誇大的基準高度。

    地形誇大的舊 API Globe.terrainExaggeration 將在 1.85 中移除。

    原理:存儲每個頂點的 f32 類型的測地法線,並在着色器中將其添加到相對中心,它的效果即使不是 64 位仿真中也是不錯的,官方測試中使用 32 位法線精度最多隻有 10 釐米的誤差值。

    float newHeight = (height - relativeHeight) * exaggeration + relativeHeight;
    positionRTC += geodeticSurfaceNormal * (newHeight - height);
    // ... 從 positionRTC 座標轉世界座標
    

    當地形誇大數字不是 1.0 時(哪怕是 1.01)才存儲大地表面法線。所以,這是一個消耗內存的行爲。靜態誇大(舊API)是類似於烘焙的效果直接寫入幾何中,所以內存是不變的。在 TerrainMesh 類中,大約會額外佔用 30% 的內存(可參考 Chrome 開發者工具的 內存快照,查看具體類的內存佔用)。

    參考 pr

  • 新增 ShadowMap 參數:options.fadingEnabled 來當光源接*地*線時,控制陰影是否具有淡出的效果。此選項默認開啓。

image

  var shadowMap = viewer.shadowMap;
  shadowMap.maximumDistance = 100000.0; // 米爲單位
  shadowMap.darkness = 0; // 月球上是黑色陰影
  // !!!
  // 新 API,這個屬性默認是 true,此處顯性設爲 false
  shadowMap.fadingEnabled = false;
  • 新增對 KTX2 和 Basis Universal 紋理格式的支持;

    • 增加對 glTF 格式中 KHR_texture_basisu 擴展的支持
    • 添加了對 8 位、16 位浮點和 32 位浮點的 KTX2 鏡面反射環境貼圖的支持
    • Material 模塊中添加了對 KTX2 圖像的支持
    • 對枚舉模塊 PixelFormatWebGLConstants 添加了 EXT_texture_compression_bptcWEBGL_compressed_texture_etcWEBGL_compressed_texture_astc 擴展

    KHR_texture_basisu 紋理支持非 2次冪 尺寸的紋理貼圖,但是官方仍然建議使用長寬尺寸一樣的、且爲 2次冪 的紋理貼圖。見 pr 9513

  • 新增自定義高度圖地形提供器,即新 API CustomHeightmapTerrainProvider,從一個回調函數裏獲取高程數據。從下列例子中可看出,只需指定能 返回高度類型數組 的回調函數、寬度、高度三個屬性即可。

var width = 32;
var height = 32;
var viewer = new Cesium.Viewer("cesiumContainer", {
  terrainProvider: new Cesium.CustomHeightmapTerrainProvider({
    callback: function (x, y, level) {
      var buffer = new Float32Array(width * height);
      for (var yy = 0; yy < height; yy++) {
        for (var xx = 0; xx < width; xx++) {
          var v = (y + yy / (height - 1)) / Math.pow(2, level);
          var heightValue = 8000 * (Math.sin(4000 * v) * 0.5 + 0.5);
          var index = yy * width + xx;
          buffer[index] = heightValue;
        }
      }
      return buffer;
    },
    width: width,
    height: height,
  }),
});

有趣的是,這個雖然很靈活,但是官方仍然建議使用成熟的 TerrainProvider,因爲這個沒有水面特效。

  • 3dTiles 擴展檢查器

    若一個 tileset 在 extensionsRequired 數組中指定了一個非官方記錄的擴展,會直接彈出運行時錯誤:

    throw new RuntimeError("Unsupported 3D Tiles Extension: " + extension)
    

    參考 API Cesium3DTileset.checkSupportedExtensions(this._extensions),官方參考了 ModelUtility.js 模塊中對 glTF 的擴展的擴展檢查。

  • 終於!更新了文檔:在 Windows *臺上所有主流瀏覽器將忽略 outlineWidth 屬性(在Windows 的 WebGL 本身不支持外邊線線寬繪製)。涉及到的模塊有:

    • BoxGraphics
    • CorridorGraphics
    • CylinderGraphics
    • EllipseGraphics
    • EllipsoidGraphics
    • PlaneGraphics
    • PolygonGraphics
    • RectangleGraphics
    • WallGraphics
    • PolylineVolumeGraphics

    屆時可以查看最新的幫助文檔。

  • KmlTour, KmlTourFlyTo, 和 KmlTourWait 模塊增加了文檔。爲 KmlDataSource 模塊的 kmlTours 讀類型屬性添加文檔,並從 KmlTourSoundCues 類中移除文檔引用。

  • 對 OSM Buildings 以及其他在 glTF 模型中用到了 CESIUM_primitive_outline 擴展的 tileset 提供隱藏邊線的能力。

    主要是在 Model.jsBatched3DModel3DTileContent.jsCesium3DTileset.jsGltf3DTileContent.jsInstanced3DModel3DTileContent.jsModelInstanceCollection.jscreateOsmBuildings.jsModelSpec.js 作出了修改,部分模塊加入 showOutline 屬性。 (參考 pr

  • 對於 glTF 某些特定的紋理和 ImageBitmap 的色彩空間,提供了 ignore 選項。

修復🔧

  • 修復了一些舊式 tileset 中頂級瓦片因爲沒有幾何誤差而不加載的錯誤

    以往有一些 3dtiles 的根屬性中沒有 geometricError,會導致 preprocess3DTileContent.js 模塊判斷錯誤。在 1.83 中已修復爲判斷 root 屬性。

image

  • 修復了 WebMapTileServiceImageryProvider 這個模塊中若 URL 使用了子域(SubDomains)後,請求會因爲查詢參數而失敗的情況(詳細問題見:9598

  • 修復了 ScreenSpaceCameraController.tilt3DOnTerain API 中當搖晃相機視角時,會有偏移的小問題。精彩推理見:9562 似乎是國人

  • 當地球表面瓦片(GlobeSurfaceTile模塊)請求錯誤時,修復在控制檯中的報錯

  • 修復了沙盒示例中 KML 示例的縮略圖丟失

  • 修復了 GlobeFS 着色器中當自定義材質的 positionToEyeECtangentToEyeMatrix 屬性未設置的錯誤

    // GlobeFS.glsl
    void main() {
      // 其他部分略
      materialInput.positionToEyeEC = -v_positionEC;
      materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(v_positionMC, normalize(v_normalEC));  
    }
    
  • 修復了 Matrix4 模塊中 inverseinverseTransformation 中使用 仿射變換 的誤導性文檔,已使用旋轉和*移替代。

  • 當 glTF 模型引用了外部圖像資源且沒有被 preferImageBitmap 加載時,它會在主線程的解碼過程中造成幀率暴跌的問題,已經修復;通常 glTF 的圖像資源都是內嵌的,也就是 glb 的形式,這個問題被官方發現並修復。針對的模塊:Scene/GltfImageLoader.jsScene/Model.js

  • 修復 Cesium3DTileStyle 中關於顏色、顯隱的誤導性 else 條件設置。邏輯上,如果沒有給定,那就應該使用默認值 true。主要針對的模塊:Scene/Cesium3DTileBatchTable.js

  • 修復後處理禁用後再啓用時發生崩潰的問題,這個修復同時能防止在第一次啓用後處理階段功能時閃屏的問題。原因似乎是如果沒有任何一個後處理階段被標記爲活動的話,緩存的紋理就不會創建 FBO,雖然這些後處理都啓用了。針對模塊:PostProcessStageCollection.js

功能廢棄⏳

  • CesiumWidget, Viewer, 及 Scene 模塊的 Scene.terrainExaggerationoptions.terrainExaggeration 將會在 1.85 版本中移除。 使用 Globe.terrainExaggeration API 來代替他們。
  • loadCRNloadKTX 函數被移除。
  • 對 IE11 的支持將在 1.84 正式停止
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章