【问题标题】:OpenGL Picking from a large setOpenGL 从一个大集合中挑选
【发布时间】:2011-08-02 17:03:40
【问题描述】:

我正在尝试,在 JOGL 中,从大量渲染的四边形中挑选(数千个)。有人有什么建议吗?

为了提供更多细节,我将大量数据绘制为带有程序创建纹理的广告牌。

我看过这篇帖子 OpenGL GL_SELECT or manual collision detection? 并发现它很有帮助。但是,我的程序最多可能需要几分钟才能完成全套渲染,所以我不认为绘制 2x(用于颜色选择)是一种选择。

我目前正在调用 glBegin/glVertex.../glEnd 进行绘图。鉴于我使用 vao 和 vbo 切换到 GPU 上的批处理渲染,您认为我会获得足够大的加速以促进颜色选择吗?

如果不是,鉴于所有反对使用 GL_SELECT 的建议,您认为我是否值得使用它?

我研究了多线程 CPU 方法来选择完全避开 OpenGL 的这些四边形。 您认为无 OpenGL CPU 解决方案是否可行?

抱歉所有问题。 我的主要问题仍然是,使用 OpenGL (JOGL) 从一大组四边形中挑选一个好的方法是什么?

【问题讨论】:

  • 如果集是几千个四边形,怎么可能需要几分钟才能渲染完整集?现在的吞吐量不是每秒数百万甚至数十亿三角形吗?
  • 你是对的。我已经修改了我的渲染技术以正常工作(通过显示列表),它现在以实时速率渲染我的程序结果。

标签: opengl graphics data-visualization jogl


【解决方案1】:

很难定义从大量四边形中挑选的最佳方法。我不太喜欢颜色选择或类似的技术,因为它们在大多数情况下似乎是不切实际的。我从来不明白为什么有这么多教程专注于 OpenGl 的新手,甚至编程专注于挑选几乎对所有东西都无用的人。例如:尝试在高度图中获取您单击的像素:不可能。尝试在您单击的模型中找到确切的网格:不切实际。

如果您有大量的四边形,您可能需要一个良好的空间分区或至少(更好)一个场景图。好的,你不需要这个,但它有很大帮助。查看场景图的一些教程以获取更多信息,了解您是否从 3D 编程开始是一件好事,因为您会了解很多概念,而不仅仅是 OpenGL 代码。

那么现在该怎么做才能开始采摘呢?在鼠标光标所在的位置取模型视图矩阵的倒数(带有glUnproject(...) 的iirc)。通过相机的方向,您现在可以将光线投射到您的空间结构(或包含空间结构的场景图)中。现在检查与四边形的碰撞。我目前没有链接,但是如果您搜索逆模型视图矩阵,您应该会找到一些页面可以更好、更详细地解释这一点。

使用这种基于光线投射的技术,您将能够在 O(log n) 中找到您的四边形,其中 n 是您拥有的四边形数量。借助基于应用程序确切布局的一些启发式方法(您的问题过于笼统,无法更具体),您可以在大多数情况下大大改善这一点。

一个简单的空间结构是四叉树。但是,您应该先从他们的光线投射开始,以充分了解这种技术。

【讨论】:

  • 感谢您的建议。我确实最终将我的应用程序空间划分为几何图形组并加速从这些组中挑选的处理。
【解决方案2】:

从来没有遇到过这样的问题,但在我看来,我认为基于 CPU 的选择是最好的尝试方法。

如果您有大量四边形,也许您可​​以按空间对四边形进行分组以避免测试所有四边形。例如,您可以将四边形分组到两个盒子中,然后先测试您是哪个盒子

【讨论】:

    【解决方案3】:

    我刚刚实现了颜色选择,但 glReadPixels 在这里很慢(我在这里读到过它可能不利于 GLCPU 之间的异步行为)。

    在我看来,另一种可能性是使用变换反馈和进行剪刀测试的几何着色器。然后GS 可以丢弃所有不包含鼠标位置的面。变换反馈缓冲区包含关于悬停网格的信息。

    您可能还想将深度写入变换反馈缓冲区,以便找到最顶部的悬停网格。 这种方法也适用于实例化(另外将实例 id 写入缓冲区)

    我还没有尝试过,但我想它会比使用glReadPixels 快很多。 我只为这个approach找到了这个参考。

    【讨论】:

      【解决方案4】:

      我正在使用从DirectX SDK 借来的解决方案,有一个很好的示例如何检测顶点缓冲区对象中的选定多边形。

      同样的算法适用于OpenGL

      【讨论】:

      • 您可能想详细说明解决方案是什么?
      • 目前我正在编写一个简单的 opengl 框架。大约一个月后会在 Github 上发布。
      猜你喜欢
      • 1970-01-01
      • 2021-08-19
      • 2020-11-22
      • 2014-03-13
      • 2016-12-01
      • 1970-01-01
      • 2012-09-17
      • 2022-01-19
      • 2011-06-01
      相关资源
      最近更新 更多