Scene Graph故名思意就是场景图,或者说是用来组织场景的一种“图”数据结构,通常是以逻辑关系(比如整体-部分)划分数据,当然也有按照其它关系(比如空间关系,状态等)划分数据的。其特点是都是层次结构,层次结构的好处是某个层次的数据的规模相比整体数据能大规模衰减,缩小规模当然能提高效率。常见的Scene Graph实现有有向非循环图(DAG),无向非循环连通图(UDCG 即Tree)等结构。
来看看使用SG的好处是什么,先来看看别个的Scene Graph实现。
WildMagic (ver 1.07):
特点:
- 场景图的结构方面:以Tree来实现,即Node有0-1个Parent Node,0-*个Child Node
- 优点:使用Tree,非常简洁明了,方便Traverse,从上至下,从下至上。
- 缺点:Node和Geometry共同继承自Spatial,容易造成基类Spatial的膨胀,无论是成员还是接口,实际上有些Node的Spatial属性不多,象Light。
- 缺点:使用Tree,造成某些Node的share上麻烦,比如Geometry Entity的Share,类Geometry的Parent最多只有一个,如果想共享Geometry,必须生成多个Geometry挂到不同的Node下。
- 几何实体与场景图的关系:Geometry Entity不是Node,挂在Node下
- 如何裁剪Cull:包含BVH
- 渲染状态的处理:不支持State Sort
- 其它细节:
- Transform不是Node
- Light是Node
- Camera 是Node (本人根据最新版本改动)
OSG (ver 2.8.1):
特点:
- 场景图的结构方面:以DAG来实现,Node有0-*个Parent Node,Group Node 有0-*个Child Node
- 优点:使用DAG,能方便的共享Node,易于扩展。比如:Geometry的共享。
- 缺点:包含多个Parent Nodes的时候不方便Traversal。
- 几何实体与场景图的关系:Geometry Entity不是Node,挂在Node下
- 如何裁剪Cull:包含BVH
- 渲染状态的处理:支持State Sort,支持State Cache
- 优点:State Sort,相同State Set的一块渲染,减少渲染State切换的开销。
- 优点:State Cache,在State有必要的时候才去更新,减少State频繁的切换和查询。
- 其它细节:
- Transform是Node
- 优点:Transform作为Node能Share Transform Data,减小了Node的大小。
- Light是Node
- Camera 是Node
OGRE (ver: v1-4-7):
特点:
- 场景图的结构方面:以Tree来实现,以Tree来实现,即Node有0-1个Parent Node,0-*个Child Node
- 优点:使用Tree,非常简洁明了,方便Traverse,从上至下,从下至上。
- 几何实体与场景图的关系:Geometry Entity不是Node,挂在Node下,Geometry可以方便的被不同Node共享。
- 如何裁剪Cull:包含BVH
- 渲染状态的处理:支持State Sort
- 优点:上层支持Render Strategy的Sort,底层支持Material/Texture Name的Sort
- 其它细节:
- Transform是Node
- 优点:Transform作为Node能Share Transform Data,减小了Node的大小。
- Light是Node
- Camera 是Node
可以说OGRE是composite模式的复杂化,可以看出entity和Node的关系是叶子(terminal)和节点的树结构关系,从某种意义上说,entity叶子是非平凡的,而节点是平凡的。
引用自 http://www.cnblogs.com/soroman/archive/2009/12/31/1637176.html