【问题标题】:Best Method for Vertex Selection in OpenGL 4OpenGL 4 中顶点选择的最佳方法
【发布时间】:2014-06-30 21:31:17
【问题描述】:

我找到了这篇文章,有点回答我的问题,但不完全:

How to drag the line segment by selecting the vertex

我要解决的问题:执行顶点选择的现代方式(使用 OpenGL 4 架构):

  • 用户画了一个选择(橡皮筋,这不是我想要的)
  • 我假设在这个阶段我可以为模型中的每个顶点提供某种唯一 ID
  • 所选区域以某种方式重新渲染、离线使用某种顶点/片段着色器,该着色器将顶点存储在我可以读回的缓冲区中?

我只是猜测它涉及某种缓冲区,着色器可以在其中写入渲染顶点的结果,该缓冲区在程序中是可读的。我想知道是否有人已经这样做了,或者至少可以让我朝着正确的方向前进。它需要(理想情况下)快速(在非常大的模型上工作),并使用 OpenGL4(没有弃用的功能,如 GL_SELECT 等)。

  • 理想情况下,我还需要使用相同的技术来选择其他组件,例如边和面。

【问题讨论】:

  • 我认为您可以使用此处描述的技术:rastergrid.com/blog/2010/02/… 如果您想使用深度缓冲区来确定可见性,您可以在顶点着色器的每个投影位置对其进行采样点并将该信息传递给几何着色器,几何着色器决定是否将该点发送到反馈缓冲区。我认为该技术不能用于边缘或面。
  • 谢谢,这很有帮助。当我有一个可行的解决方案时(如果之前没有人回答),我会在这里查看并发布我的答案。但这是一个好的开始。

标签: opengl opengl-4


【解决方案1】:

坦率地说:OpenGL 是将事物绘制到屏幕上,而不是场景管理或选择。

您可以使用现代 OpenGL 来实现选择,使用变换反馈缓冲区并滥用 FBO 作为顶点 ID 缓冲区。

但我真的不会为此使用 OpenGL。至少不是绘图管道。如果需要 GPU 加速,我会使用 OpenCL 或 OpenGL 计算着色器将我感兴趣的顶点子集转换为屏幕空间,并从中构建屏幕空间 2D Kd 树。然后使用该KD树执行最近邻/边界搜索以查找哪些顶点在选择范围内。如果 OpenCL 或 OpenGL 计算着色器不可用,您也可以在 CPU 上进行转换。

【讨论】:

  • 这很棒而且非常有用。我认为您不是第一个坚持 OpenGL 不是场景图管理系统这一事实的人。取点。例如,您建议的方法的问题在于它不能处理深度排序。例如,如果我想选择仅可见的顶点,则 2D k-d 树方法将不起作用!这就是我想知道涉及渲染的方法是否会更好的原因?
  • @user18490:您当然可以读回您选择“进入”的渲染的深度缓冲区,并且对找到的顶点的测试通过了深度测试。
  • 是的,这是可能的。所有这些听起来都不错,但我很难相信无论是 Rhino、Maya 还是 Blender 的建模工具都使用这种方法。为此,必须创建一个加速结构似乎需要做很多工作。如果编辑点会发生什么?你需要重建 id-tree 等等。这太疯狂了。
  • @user18490:屏幕空间 Kd 树的构建速度非常快。此外,您不必平衡树进行选择。但是你肯定想要一个空间细分,否则一个天真的选择机制的 O(n) 会咬你。 Blender 使用混合方法:在 Z-shaded 模式下,指针下片段的深度针对候选顶点进行测试,并且仅考虑通过深度测试的顶点。
  • 你还是要在每次移动一个点时更新结构。我相信你,你似乎知道搅拌机。如果您只想渲染或选择具有特定区域的顶点,我会假设事情会涉及更多。我认为奇怪的是没有关于这样一个基本/重要功能的明确教程(找不到如何将@符号保留在前面)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 2012-06-07
相关资源
最近更新 更多