在此演示文稿中,将介绍 SceneGraph 和 SceneTree。
ST(SceneTree)本质上是SG(SceneGraph)的展开同步副本。
因为无论如何你都需要ST,因为:
它提供了实例,您需要在其中保存属性
您无论如何都需要遍历 ST 以更新转换和其他级联变量,例如可见性
即使 SG 提供较少的冗余,那么首先拥有 SG 有什么意义?
在此演示文稿中,将介绍 SceneGraph 和 SceneTree。
ST(SceneTree)本质上是SG(SceneGraph)的展开同步副本。
因为无论如何你都需要ST,因为:
它提供了实例,您需要在其中保存属性
您无论如何都需要遍历 ST 以更新转换和其他级联变量,例如可见性
即使 SG 提供较少的冗余,那么首先拥有 SG 有什么意义?
引用 Markus Tavenrath 的话,他被问到了同样的问题:http ://pastebin.com/SRpnbBEj (作为IRC 讨论的结果(开始 ~9:30))
[我的重点]
一般来说,对于 SceneGraph 的一个论点是,人们已经有了他们的自定义 SceneGraphs 实现,并且出于遗留原因需要保留它们, 而这个 SceneGraph 是 CPU 在渲染阶段成为瓶颈的原因。我演讲的目的是展示如何以 GPU 可以解决瓶颈的方式增强传统的 SceneGraph。一个非常有趣的实验是将这些技术添加到 OpenSceneGraph……</p>
除此之外,SceneGraph 在数据操作、数据访问和重用方面更强大。即,如果您想用多个节点实例化复杂的对象,菱形会非常强大。我们 SceneGraph 中的另一个强大功能是属性功能,它将在未来用于动画(搜索 LinkManager)。使用 LinkManager,您可以创建连接属性的网络,并让数据以定义的顺序沿着链接流动。动画缺少的是可以用作动画输入的 Curve 对象。所有这些功能在每个对象级别上都有一定的内存大小成本,更多的内存意味着在遍历期间有更多的缓存行,这意味着更多的 CPU 时钟用于遍历。
SceneTree 旨在仅保留层次结构和必须沿层次结构传播的少数属性。这样,节点非常轻量级,因此如果需要,遍历非常有效。这也意味着 SceneGraph 中提供的许多功能在 SceneTree 中不再可用。尽管通过 SceneTree 获得的知识,应该可以编写一个提供 SceneTree 大部分性能特征的 SceneGraph。
根据您正在编写的应用程序的类型,您甚至可能认为 SceneTree 太大,您可以直接在 RiX 之类的接口上编写应用程序,该接口不再具有层次结构,从而消除了另一个层 ;-)。
所以第一个原因是人们已经习惯了使用场景图并且存在许多自定义实现。
除此之外,场景树实际上是一个经过修剪的场景图,其中只有必要的组件,这意味着场景图对艺术家和建模者更有用,因为它可以更好地抽象场景。例如,一个复杂的属性可能是一个 RNG 种子,它会影响人群中每个人的外观。
在场景图中,根 Person 节点只有一个属性seed
。它的孩子将根据该种子选择精确的网格和颜色。但是在扩展的树中,用于替代发型、衣服等的未使用的网格已经被修剪了。