OpenGL - 采摘(最快的方式)

OpenGL - Picking (fastest way)

我想实现场景拾取(鼠标点击、移动等)。最好、最快的方法是什么?我曾经将 glSelectBufferglRenderModeGL_SELECT 一起使用,然后再次渲染整个场景(当然有提升,没有纹理,重着色器等)。

在每次鼠标单击、移动和拖动时递归渲染一个数字(几何体 ID)的所有节点和几何体太慢了。有人知道更好的方法吗?

编辑: 读取深度缓冲区的解决方案似乎很简单,但是如果我不想选择一些几何图形并且它们已经被淹没以进行缓冲怎么办?查找包含点的框可能不准确,因为点可以在多个框中。

是否可以一次写入两个帧缓冲区、深度缓冲区?然后我可以通过着色器将几何体 id 写入一个缓冲区。那么速度呢?

过去我使用glReadPixels( xf, yf, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &zf);读取屏幕space中某点(xf,yf)的深度缓冲区值。 然后,您可以将该点反投影回世界坐标(乘以模型视图和投影矩阵的逆矩阵。 这可以通过 gluUnProject 完成,前提是您愿意在您的应用程序中包含 GLU 库。

这为您提供了一个坐标,然后您需要搜索您的对象以找到一个具有包含该坐标的边界框的对象。此对象是所选对象。

如果您想了解更多相关信息,我建议您搜索有关 Unprojecting 的信息,https://www.opengl.org/archives/resources/faq/technical/selection.htm 也很有帮助(并推荐您可以使用的其他技术)。

因为我是新来的,所以我不能直接回答乔,所以我会在这里回答。 我从来没有尝试过他的方法,所以我不确定它是否适合你。 希望它会,如果没有:我会给你我的版本。 有多种方法可以做到这一点。 再次渲染整个场景似乎有点矫枉过正。

我的方法是OBB-Ray相交测试。您在几何体周围考虑面向对象的边界框,并检测它们是否与来自鼠标​​单击的光线发生碰撞。如果您需要较低的精度,我会说选择 AABB 甚至 Sphere。更精确:凸包。请注意,您要求的精度越低,算法越快。 这可能有点矫枉过正,但如果您不想自己实现算法,请考虑使用物理库来加速计算,例如 Bullet 或 PhysX。 另一种方法是我以前从未使用过的 OpenGL hack。

这里解释了所有这些方法: http://www.opengl-tutorial.org/miscellaneous/clicking-on-objects/