【问题标题】:OpenGL - Picking (fastest way)OpenGL - 拾取(最快的方式)
【发布时间】:2015-01-19 20:21:54
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ opengl optimization


    【解决方案1】:

    由于我是新来的,我无法直接回答 Joe,所以我会在这里回答。 我从来没有尝试过他这样做的方式,所以我不确定它是否适合你。 希望它会,如果不是:我会给你我的版本。 有很多方法可以做到这一点。 再次渲染整个场景似乎有点过头了。

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

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

    【讨论】:

    • 确实,现代版本的 OpenGL GL_SELECT 和选择缓冲区都消失了。要么做一个光线投射实现,要么你可以做一些类似于 GL_SELECT;使用将对象 ID 写入帧缓冲区对象的自定义着色器渲染场景。回读 FBO 像素以获取鼠标光标下对象的 ID。
    • 感谢您的版本,但我想以像素精度进行处理。这对我来说不舒服,因为我必须导入一些物理库,但它似乎很快并且有多个交叉点有什么好处。
    • 没问题。如果你想自己实现算法,我推荐 Christer Ericson 的 Real-time Collision Detection 一书,或者阅读 Github 上 Bullet 的源代码来实现你所需要的。
    【解决方案2】:

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

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

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

    【讨论】:

    • 这种方式看起来不错,但是读取GPU深度缓冲区是否足够快?就我而言,我必须创建 FBO,因为在绘制一帧期间,我可能会多次清除深度缓冲区。它仍然比其他方式更快吗?谢谢。
    • 在不确切知道自己在做什么的情况下,很难说最好的技术是什么。但是,我预计读取深度缓冲区(即使您必须使用 FBO)不会花费足够的时间来阻止您的程序以交互方式运行(前提是它的运行速度比 60fps 快一点)。也就是说,只要您考虑渲染顺序并仔细选择正确的点来执行 glReadPixels,我就不会期望您需要使用 FBO。
    • 不幸的是,这是很多“运行速度够快吗?”的最佳答案。问题是“试试看”
    • 非常感谢您的建议。我会试试的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2010-11-20
    相关资源
    最近更新 更多