osg的渲染樹

          osg存在兩棵樹,場景樹和渲染樹。場景樹是一顆Node組成的樹,這些Node可能是矩陣變換,或者是狀態(tài)切換,或者是真正的可繪制對象,它既反映了場景的空間結(jié)構(gòu),也反映了對象的狀態(tài)。而渲染樹則是一顆以StateSet和RenderLeaf為節(jié)點的樹,它可以做到StateSet相同的RenderLeaf同時渲染從而不用切換Opengl狀態(tài),并且做到盡量少的在多個不同State間切換。渲染樹在CullVisitor的cull過程中逐漸創(chuàng)建。

          SceneView包含兩個與渲染相關(guān)的兩個成員,一個RenderStage對象與StateGraph對象

          StateGraph顧名思義,就是以狀態(tài)為節(jié)點的圖。StateGraph包含了真正的可渲染對象RenderLeaf,但是一個StateGraph是不夠的,因為不同的RenderLeaf可能會有不同的StateSet,于是StateGraph內(nèi)部包含一個以StateSet為key,StateGraph為value的Map對象,從而形成一顆渲染樹

          渲染時以該渲染樹為基準按一定順序逐漸渲染各個RenderLeaf。以何種方式遍歷該樹呢,這正是RenderStage的任務(wù)。

          RenderStage從RenderBin派生

          RenderBin包含了一個StateGraphList,該List將渲染樹中的各個StateGraph摘取出來,形成列表。形成列表的過程就是遍歷渲染樹的過程。RenderStage可以在RenderBin渲染之前之后做一些預處理和后處理,以完成一些特殊效果。

          RenderStage包含兩種類型的RenderBin,透明與不透明的。對于Transparent RenderBin比較難處理,就是必須按深度順序調(diào)用gl函數(shù)渲染對象,否則可能半透明會有問題。對于Opaque RenderBin則沒有此限制,它只需按照盡量少切換狀態(tài)的原則排列StateGraph即可。

          StateSet的SetRenderingHint函數(shù)可以用來控制使用那個RenderBin進行渲染,題外話,StateSet的setAttributeAndModes函數(shù)可以指定AlphaFunc與BlendFunc,前者功能相當于Alpha測試,后者則反映了Alpha混合的方式。使用方式類似下面:

          BlendFunc* func = new BlendFunc();

          func->setFunction(...);

          dstate->setAttributeAndModes(func, StateAttribute::ON);

           

          可以參考的相關(guān)osg代碼:

          void CullVisitor::apply(Geode& node)

          void CullVisitor::addDrawableAndDepth(osg::Drawable* drawable,osg::RefMatrix* matrix,float depth)

          StateGraph的部分函數(shù)。。。

          void RenderLeaf::render(State& state,RenderLeaf* previous)

          void RenderBin::drawImplementation(osg::State& state,RenderLeaf*& previous)

          void RenderStage::drawImplementation(osg::State& state,RenderLeaf*& previous)

          posted on 2007-08-06 22:05 雁過無痕 閱讀(5258) 評論(2)  編輯  收藏

          評論

          # re: osg的渲染樹 2007-08-30 11:27 dreamstone

          寫的很好啊  回復  更多評論   

          # re: osg的渲染樹 2008-06-04 17:13 SodaWater

          學習了~~
          博主好文  回復  更多評論   


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          <2007年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導航

          統(tǒng)計

          常用鏈接

          留言簿(7)

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 孝义市| 聂拉木县| 福泉市| 大宁县| 新营市| 雅安市| 鄂托克前旗| 阿克苏市| 洛川县| 阜南县| 麻城市| 柳江县| 平果县| 百色市| 海南省| 兴义市| 五华县| 阿巴嘎旗| 禄劝| 琼海市| 常熟市| 江孜县| 武宁县| 阜新市| 澎湖县| 新郑市| 游戏| 云霄县| 姚安县| 闻喜县| 瑞昌市| 文山县| 平泉县| 临海市| 红安县| 宁津县| 罗江县| 秦安县| 咸阳市| 若尔盖县| 惠东县|