[原][OSG]深入osg函數----SceneView::cull 函數


參考:最長一幀

 

先介紹幾個類:

osgUtil::CullVisitor:“篩選訪問器”

當我們使用它遍歷場景圖形的各個節點時, CullVisitor 將會對每一個遇到的節點執行場景篩選的工作,判斷它是否會超出視截錐體范圍, 過於渺小,或者被遮擋節點(OccluderNode)擋住,從而將無助益於場景瀏覽的物體篩選並 剔除,降低場景繪制的資源消耗

osg::RenderInfo:“渲染信息”管理器

負責保存和管理與場景繪制息息相關的幾 個重要數據:當前場景的視景器,當前場景對應的所有攝像機,以及當前所有 OpenGL 渲染 狀態和頂點數據(使用第十七日所述的 osg::State 類保存)。這些數據將在場景篩選和渲染時 為 OSG 系統后台的工作提供重要依據。

osgUtil:: StateGraph:“狀態節點”

我們可以對比場景樹的組節點(Group),將 StateGraph 理解為 OSG 渲染后台的組節點。它的組織結構與場景圖形的節點結構類似,但是狀態樹的 構建主要以節點的渲染狀態集(StateSet)為依據:設置了 StateSet 的場景節點,其渲染狀 態會被記錄到“狀態節點”中

 

osgUtil::RenderLeaf:“渲染葉”

理解為OSG渲染后台狀態樹的葉節點,是記錄場景樹中存在的各種Drawable對象

 

osgUtil::RenderStage:“渲染台”。

OSG 的渲染后台除了使用“狀態樹”來組織和優化節點的渲染狀態之外,還有另外一種用於場景實際渲染的組織結構,我們稱之為“渲染樹”,“渲染樹”的根節點就是“渲染台”

 

osgUtil::RenderBin:“渲染元”

OSG 渲染樹的分支節點,不過對於沒有特殊要求 的場景渲染來說,更多的渲染樹分支也許並不需要:場景中需要渲染的元素及其渲染屬性被 保存到各個“狀態節點”和“渲染葉”當中;渲染樹只要按照遍歷的順序,把這些數據記錄 到作為根節點的“渲染台”當中就可以執行場景 的繪制工作了。

 

osgUtil::SceneView::cull 函數流程:

1、  初始化必要的 SceneView 類成員變量:

該視圖的渲染信息(_renderInfo),

篩選訪問器(_cullVisitor),

狀態樹根節點(_stateGraph)

渲染樹根節點(_renderStage)。

此外還有局部渲染狀態_localStateSet 的更新(SceneView::updateUniforms)

2、執行 SceneView::cullStage 函數,它也是場景視圖篩選工作的核心函數。

3、執行 CullVisitor::clampProjectionMatrix,根據遠/近平面的取值,重新設定場景視圖 的投影矩陣。

 

核心函數SceneView::cullStage流程:

1、  首先統計場景中的遮擋節點(OccluderNode)

2、  將篩選所需的數據送入篩選訪問器(CullVisitor),包括篩選設置(CullSettings),狀 態樹根節點(StateGraph),渲染樹根節點(RenderStage),渲染信息(RenderInfo)。注意此 時狀態樹和渲染樹還沒有生成,我們還要設置渲染樹構建所需的各種信息

3、  “全局狀態節點”和“局部狀態節點”追加到狀態樹中

4、  使用篩選訪問器遍歷場景中的節點,在遍歷過程中將篩選出那些無法被用戶看到的 對象,並將它們裁減掉,從而提高場景繪制的效率。

for(unsigned int childNo=0; childNo<_camera->getNumChildren(); ++childNo)

  _camera->getChild(childNo)->accept(*cullVisitor);

5、  對篩選訪問器執行之后得到的 渲染樹內容進行排序和精簡

6、  計算出場景中動態對象(DYNAMIC)的數目,並保存到 SceneView 的成員 變量_dynamicObjectCount 中,方便被 SceneView::getDynamicObjectCount 函數獲取,並用於多線程模式下渲染 線程與場景更新的協調控制。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM