opengl - OpenGL 4 中顶点选择的最佳方法

标签 opengl opengl-4

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

How to drag the line segment by selecting the vertex

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

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

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

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

最佳答案

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

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

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

关于opengl - OpenGL 4 中顶点选择的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24488080/

相关文章:

c++ - 带交错缓冲区的 OpenGL glMultiDrawElementsIndirect

c - 纹理似乎正在读取未初始化的内存

c++ - OpenGL 4 header

java - 从 javax.vecmath.Matrix4f 创建 float[]

performance - OpenGL 在多个地方多次绘制相同的多边形

c++ - glutDisplayFunc 显示垃圾

c++ - OpenGL 4.5 直接状态访问渲染一个三角形 - GL_INVALID_VALUE

c++ - 使用 glMapBuffer 用一个缓冲区渲染多个对象?

java - opengl3中的立方体纹理

c++ - 使用 SDL 在 OpenGL 表面上绘制文本