osg的渲染樹

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

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

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

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

          RenderStage從RenderBin派生

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

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

          StateSet的SetRenderingHint函數(shù)可以用來控制使用那個(gè)RenderBin進(jìn)行渲染,題外話,StateSet的setAttributeAndModes函數(shù)可以指定AlphaFunc與BlendFunc,前者功能相當(dāng)于Alpha測(cè)試,后者則反映了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 雁過無痕 閱讀(5259) 評(píng)論(2)  編輯  收藏

          評(píng)論

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

          寫的很好啊  回復(fù)  更多評(píng)論   

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

          學(xué)習(xí)了~~
          博主好文  回復(fù)  更多評(píng)論   


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


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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(7)

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 杭州市| 襄城县| 疏勒县| 龙里县| 嵊州市| 台北市| 楚雄市| 突泉县| 丰县| 清新县| 理塘县| 巧家县| 措勤县| 石家庄市| 休宁县| 庐江县| 云阳县| 隆回县| 浠水县| 宝应县| 齐齐哈尔市| 双牌县| 台前县| 平遥县| 定日县| 桃江县| 穆棱市| 尼玛县| 仙游县| 原阳县| 三都| 石首市| 天津市| 郓城县| 江达县| 莫力| 卓资县| 丰镇市| 米泉市| 石林| 马尔康县|