首先,免责声明。我很清楚 X 与 Y 的标准答案 - “这取决于”。但是,我正在开发一个非常通用的产品,并且我试图弄清楚“这取决于什么”。我也不能真正测试各种各样的硬件,所以“试一试”充其量只是一个不完美的衡量标准。
我一直在做一些谷歌搜索,我发现很少有关于使用离线渲染目标/表面进行命中测试的参考。我不确定命名法,但我正在谈论的是使用非常简单的着色器将几何 ID(例如)渲染到缓冲区,然后读取鼠标下的像素值以查看直接在下面的几何鼠标指针。
然而,我找到了 101 个关于进行三角形相交的不同教程,例如 D3DXIntersect 和 DirectX 示例“Pick”。
我对此有点好奇——我原以为使用硬件是标准方法。无论如何,它应该快很多数量级,并且应该扩展得更好。
我对图形编程比较陌生,所以这里是我的假设,供你废止。
1) 一个简单的着色器进行几何变换并写入一个节点 + UV 值应该几乎是免费的。
2) HW pick 方法的主要成本是缓冲区获取,当将渲染表面从 GPU 中取出以供 CPU 读取时。我不知道这是多么昂贵。我们?小姐?秒?分钟?
3)这可能很明显,但我假设三角形交点(D3DXIntersect)只能在 CPU 上实现。
4)人们想要避免的一个可能成本是额外渲染目标(zbuffer+surface)的成本。我猜 1024x1280(标准屏幕尺寸?)大约 10 兆。这对我来说是可以接受的,尽管如果我可以渲染更小的表面(用内存来交换精度)我会这样做(这可能吗?)。
这一切都导致了一些想法。
1)对于非常简单的场景,三角形相交可能会更快。在这一点上很难猜出什么是简单/复杂的。我正在研究可能的 100 到 10000 的 tris。恐怕不止于此。
2)无论是否使用(在我的情况下),都需要渲染硬件缓冲区。但是,它可以免费重复使用(即单击拖动,鼠标在静态场景中移动)
2a)如果我的场景每帧都更新,或者如果我的鼠标交互有限,那么三角形相交可能更可取。
现在我已经写完了,我看到有人问了一个类似的问题:(3D Graphics Picking - What is the best approach for this scenario)。我的问题是(a)为什么您需要重新渲染您的拾取表面以进行点击拖动,因为您的场景实际上并没有改变,并且(b)它不会比三角形相交更快吗?
我欢迎想法、批评和任何形式的旁观:-)