天天看點

調試最長的一幀(第20天)

電子書上給了個例子,抄一抄,加深下印象,也驗證下以前的想法對不對

對于場景執行個體

調試最長的一幀(第20天)

其中"ss"加上數字代号來辨別這些Stateset對象,後面括号中的兩個參數分别表示setRenderBinDetails的兩個設定項("-"表示空字串,"R"表示"RenderBin","D"表示"DepthSortedBin"

ss03->setRenderBinDetails(0,"");   //預設設定

ss11->setRenderBinDetails(0,"");

ss13->setRenderBinDetails(-1,"RenderBin");

ss14->setRenderBinDetails(1,"RenderBin");

ss15->setRenderBinDetails(10,"DepthSortedBin");

ss16->setRenderBinDetails(10,"DepthSortedBin");

關于狀态集,對于葉節點_geode3,以及所有六個幾何對象均設定了關聯的渲染狀态集(StateSet),且幾何體1,2共用一個stateset。osg中所有的Drawable幾何體對象都會自動關聯一個StateSet對象,無論使用者是否在陳鼓中設定。

進入渲染背景後,OSG将為這個場景生成“狀态樹",它是由”狀态節點“StateGraph和渲染葉RenderLeaft組成。

調試最長的一幀(第20天)

上圖的狀态根節點和局部狀态節點都是由狀态樹自動生成的。其中後者的主要工作是儲存和維護一些渲染背景自動建立的渲染屬性;而全局狀态節點則儲存了一個名為_globalStateset的全局渲染狀态集對象,它的取值是場景主錄影機的StateSet.。換句話說,任何對狀态樹的周遊都将首先及至場景主錄影機的渲染狀态,然後才是各個節點的渲染狀态,這就是_globalStateSet的功用所在。

調試最長的一幀(第20天)
調試最長的一幀(第20天)

狀态樹的建構規則

1,狀态樹是根據渲染狀态stateset來生成的,那些沒有設定Stateset的場景節點不影響狀态樹的架構

2,場景中的Drawable對象在狀态樹中被置入分别的渲染葉(RenderLeaf)中,而一個或多個渲染葉必然被一個狀态樹末端的節點StateGraph擁有。

3,共享同一個渲染狀态的Drawable對象(圖中的_drawable1和_drawable2)在狀态樹中将置入同一個末端節點。

可見,我上節中考慮的是錯誤的,以為和場景圖架構相同,其實毫不相幹。

生成狀态樹的同時,OSG渲染背景還将生成對應的渲染樹,其組成為一個RenderStage和多個RenderBin,如果都是預設狀态(渲染順序0),則所有狀态樹的末端節點(其中必然包括一個或多個渲染葉)都會按周遊順序儲存到渲染樹根節點(渲染台)中,即可建構渲染樹完畢。然而,由于對場景中部件得渲染樹順序

調試最長的一幀(第20天)

可見,setRenderBinDetails()的值有0,-1,1,10共四種。

如果葉節點3 _geode3也設定為1,且用"RenderBin"或者”DepthSortedBin"方式,按照指定的渲染順序号來繪制,那麼在渲染樹_geode3節點及其附帶的幾何體将構成更複雜的結構形式,如

ss03->setRenderBinDetails(1,"RenderBin");

雖然ss03和ss14的渲染細節設定完全一樣,但是由于關聯ss03和ss14的節點之間是父子關系,它們不能放入同一個渲染元,還取決于兩個Stateset對象在狀态樹中所處的層次。

調試最長的一幀(第20天)

感覺和我以前想象的還是有差別的。

電子書上的總結,抄一抄。

osgUtil::StateGraph:狀态樹的分支節點(狀态節點),負責管理和繪制場景樹中的一個渲染狀态(StateSet)對象,末端的StateGraph節點還負責維護一個渲染葉RenderLeaf清單。

osgUtil::RenderLeaf:狀态樹的葉節點(渲染葉),負責管理和繪制場景樹末端的一個幾何體(Drawable)對象。

osgUtil::RenderStage:渲染樹的根節點(渲染台),負責管理預設渲染樹徐的所有末端StageGraph節點(附帶渲染葉),并儲存了謙虛渲染和後續渲染的渲染台指針清單。

osgUtil::RenderBin:渲染樹的分支節點(渲染元),負責管理自定義渲染順序的末端StateGraph節點(附帶渲染葉);渲染樹的根節點和分支節點隻能有"RenderBin"和"DepthSortedBin"兩類子節點,但可以根據不同的渲染順序号衍生出多個子節點,它們在渲染時将按順序号升序的此粗執行繪制。

大概明白了,就這樣吧