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) 編輯 收藏