opengl - 有没有场景图的替代品?

标签 opengl directx graphic scene scenegraph

场景图让您可以推断它们的位置 -> 如果不需要渲染一个节点,则该节点的子节点也不需要渲染。

但是,如果场景中的对象不断改变位置,这似乎不是最好的方法,所以你总是必须更新你的场景图。

我想知道是否有完全不同的方法来降低场景复杂性?

最佳答案

if one node doesn't need to be rendered, the children of that node also don't need to be rendered.

这不是真的。想象一个父节点只是稍微不在视线范围内,但一个子节点却清晰可见。

场景图不是可见/不可见几何确定的工具。场景图管理对象之间的几何、转换层次结构。星系 → 恒星 → 行星 → 卫星,等等。

您实际上想到的不是场景图,而是 Bounding Volume Hierachies (BVH),这是一个完全不同的概念。是的,您可以将 BVH 与 Scenegraph 数据混合使用,通常可以这样做,但它们的使用方式不同。

But it seems that it might not be the best approach if the objects in the scene are constantly changing position, so you always have to update your scene graph BVH.

确实如此。因为 BVH 结构是一个持续研究的主题,主要集中在自适应 BVH 修改上,您不必重建整个 BVH 只是一个子集更改。然而,BVH 本质上是搜索树结构,要使搜索高效,您必须平衡搜索树,这本身可能是一项代价高昂的操作。

因此,需要在重建整棵树或平衡它的成本之间进行权衡。

光明的一面曾经非常需要完美的隐形表面识别,而软件光栅化时代所需要的这一点早已不复存在。

我们现在生活在一个 GPU 有大量过度绘制储备的时代,“越差越好”的方法通常会产生良好的结果。一个非常好的方法是让 GPU 和 CPU 协作遍历一个非常简单的、仅松散连接的 BVH,基于 Axis Aligned Bounding Boxes (AABB),其中可以测试树节点重叠和子体积的可见性通过将 AABB 边界面发送到 GPU 进行空运行渲染,该渲染不产生像素,但会收集统计信息,如果实际绘制了任何边界体积,则该值是多少。这是现在很流行的一种方法,效果很好。

关于opengl - 有没有场景图的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16251499/

相关文章:

c++ - glDrawElementsInstanced 在 18680 个实例时卡住或减慢

c - gluLookAt 不工作

c++ - ID3D11DeviceContext::Map 性能低下

c++ - 更新 Directx 10 和 11 中的顶点缓冲区

vb.net - vb.net 中的 3D 文件

delphi - 单独旋转矩形点使矩形变形

java - 在 jframe 中显示 jpanel 的图形界面

java - LWJGL3 : Overloaded glBufferData methods

c - OpenGL Ubuntu 深度

android - 如何在android中创建像图片中的布局?