上一節我們大致上過了一遍sceneview::cull()函式,通過研究,我們發現上圖中的這一部分的**才是整個cull過程的核心部分。所以今天我們來仔細的研究一下這一部分。
1、cullvisitor->pushstateset函式:
a、_currentstategraph = _currentstategraph->find_or_insert(ss); 判斷傳入的渲染狀態 ss 是否已經存在於這個狀態節點中,如果存在則返回找到的那個ss,如果不存在新建乙個包含了 ss 的狀態節點。
b、建立渲染樹,這個過程必須得滿足三個條件。1)設定了渲染細節userenderbindetails()並且滿足binname不為空(只能為「renderbin」或「depthsortedbin」);2)渲染狀態沒有採用覆蓋渲染細節(override_renderbin_details)的方式(_numberofencloseoverriderenderbindetails==0);3)使用 setrenderbindetails 設定了渲染細節,如果滿足這三個條件將嘗試轉到指定的節點或者新建乙個渲染元(renderbin::find_or_insert 的工作),並使用堆疊記錄上一次在渲染樹中的位置。此外,渲染樹的構建過程中只生成空的渲染元(renderbin)節點,向其中納入狀態節點和渲染葉的任務將在後面的工作中完成。
3、cullvisitor-> popstateset函式:
a、_numberofencloseoverriderenderbindetails減一,然後還是上面介紹的cullvisitor->pushstateset函式介紹的三種情況,判斷是否使用了renderbindetails。然後還是從堆疊中取出上一次渲染樹中所處的渲染元節點,並跳轉到這一位置。
b、狀態樹從當前位置跳轉到其父節點,即:?
_currentstategraph = _currentstategraph->_parent;
通過簡單的對cullvisitor->pushstateset函式以及cullvisitor-> popstateset函式的介紹,可以了解到在遍歷場景節點樹時,使用 pushstateset 將某個節點的渲染狀態置入,然後再將它的子節點的渲染狀態置入,直到遍歷完成。當結束這個子樹的遍歷時,則依次使用 popstateset 彈出_currentrenderbin 和_currentstategraph,直到返回初始位置為止。這麼整個過程就是構建起渲染後台的狀態樹和渲染樹。並且,假如在篩選(cull)過程中我們判斷某個節點(及其子樹)應當被剔除掉時,只要跳過 pushstateset 和 popstateset的步驟,直接返回,就不會在進行渲染操作。這就是我們下一步要討論的cullvisitor 的工作。
cullvisitor根本上就是nodevisitor的子類,所以他的執行過程可以按照節點訪問器(nodevisitor)的工作原理來理解。
探索未知種族之osg類生物 器官初始化一
我們把viewerbase frame 比作osg這類生物的肺,首先我們先來大概的看一下 肺 長什麼樣子,有哪幾部分組成。在這之前得對一些固定的零件進行說明,例如 done代表osg的viewer是否被刪除釋放記憶體 firstframe代表是否是第一次進入frame函式。那麼接下來我們會發現fra...
未知環境探索(一)
自己摸索難免走彎路。言歸正傳 1 自主環境探索關鍵技術 與傳統的路徑規劃相比,自主環境探索並不是簡單的使機械人到達某一特定的目標點,而是使機械人不斷到達一系列目標點以便能夠獲取整個環境的資訊。需解決的問題 如何根據感測器的資訊產生一系列的目標點 如何從當前位置運動到目標點 如何對感測器資訊進行處理而...
手機在於折騰,探索未知世界!
我最近折騰乙個wm系統的手機。手機和開發板的區別就在於 手機沒有任何資料,而開發板有全套電路圖 bsp原始碼!為了探索手機中的未知世界,唯一的辦法就是逆向工程,逆向分析最好的就是寫程式去驗證。乙個不知天高地厚的少年就開始折騰他的手機 花了大量時間去尋找jtag測試點 成功 尋找支援pxa300的廉價...