我們從下面圖片去觀察cesium是怎樣執行primitive的渲染命令的
1,初始化cesium場景時候會默認執行CesiumWidget類里面的startRenderLoop方法,該方法的作用是
調用瀏覽器requestAnimationFrame方法循環執行widget.render方法進行渲染,我們再看看
CesiumWidget里面的rander方法,這個方法調用了scene.initializeFrame()進行初始化一幀,Clock.tick()方法觸發時鐘更新當前時間,Scene.render方法進行渲染。我們再看看Scene.render方法
該方法大致做了以下幾件事,更新幀數,預先更新3dtiles數據,預先更新相機飛行的3dtiles數據,調用render方法等
我們看看Scene.render方法,該方法內部調用Scene.updateAndExecuteCommands方法
Scene.prototype.updateAndExecuteCommands方法根據frameState.mode變量判斷是否是3d場景然后執行executeCommandsInViewport方法渲染視口內的圖元,
調用Scene類里的executeCommands方法執行繪制命令
executeCommands方法內先執行和環境相關的,例如天空盒,太陽,月亮等渲染指令。
接著根據遍歷視錐體數組,依次執行單個視錐體的渲染命令。
先Pass.GLOBE(橢球體),接著Pass.TERRAIN_CLASSIFICATION(貼地形),接著Pass.CESIUM_3D_TILE(3dtiles),Pass.CESIUM_3D_TILE_CLASSIFICATION(貼著3dtiles),接著Pass.CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW,接著Pass.OPAQUE(不透明的),Pass.TRANSLUCENT(透明的),Pass.OVERLAY(遮蓋物)
然后會觸發DrawCommand.prototype.execute方法
進入Centext.draw方法
該方法先設置幀緩沖區,渲染狀態,uniform變量,然后調用beginDraw方法
在beginDraw方法綁定幀緩沖區,應用渲染狀態(例如開啟深度測試,模板測試,混合等),綁定著色程序,并限制最大紋理單元數量。
然后執行continueDraw方法
設置模型矩陣,設置uniform變量,綁定頂點數組,根據繪制的實例數量和是否有頂點索引來決定使用context._gl.drawElements,context.glDrawElementsInstanced,context._gl.drawArrays,context.glDrawArraysInstanced其中一種方法