【发布时间】:2013-08-16 10:02:26
【问题描述】:
我正在开发一个允许用户在场景中选择 3d 对象的项目,我想知道每个人都认为处理这个特定场景的最佳方法是什么。
基本上,我们的场景至少包含 100 个对象(它们是低多边形,但由至少 ~12-15 个三角形组成)和最多约 1000-2000 个对象。
并非所有对象都始终“可拾取”,因为某些对象会遮挡其他对象,因此“可拾取”对象可能落在 800-1500 之间(取决于场景的复杂性)。
当一个对象被“拾取”时,我们希望它以某种方式突出显示,这意味着以不同的方式渲染它,这很简单,但我们希望不仅可以通过单击完成拾取,还可以通过拖动来完成 - 这意味着我们想要在很短的时间内大量运行拣货算法。理想情况下,用户会在对象仍处于“拖动”操作时看到突出显示的对象 - (这意味着应该异步完成拾取,以免滞后于主渲染?)。
我尝试过简单的光线追踪拾取,但这显然很慢,因为我们循环遍历场景中的所有三角形以找到对象。
我还尝试过基于 GPU 的拾取 - 使用像素缓冲区渲染场景,为每个对象提供独特的颜色,但通过拖动操作,这意味着多次渲染和 GPU 到 CPU 的数据传输,性能不佳.
我是否可以探索其他可能性来尝试获得我想要的性能和功能?
感谢您的宝贵时间。
【问题讨论】:
-
除了八叉树方法之外,您应该首先测试更简单的包围体。例如。球体射线相交的测试非常便宜。如果光线没有击中包围体,则无需尝试光线是否击中网格。
-
所以您是说创建球体的八叉树以及边界框并首先测试球体会有所帮助?
-
不,如果你在八叉树中发现了潜在的命中,你需要分析是否真的有命中。这可以通过首先检查包围体来加速。
-
抱歉,当然,这是有道理的。感谢您的帮助。
标签: 3d directx gpu picking ray-picking