如何在现代OpenGl(上面的3.3)中选择网格的顶点或三角形?

时间:2015-01-26 23:27:34

标签: c++ opengl glsl fragment-shader vertex-buffer

我正在开发一个项目,我需要选择网格的两个顶点并计算它们之间的最短路径。我使用GL_ARRAY_BUFFER和GL_ELEMENT_ARRAY_BUFFER来绑定OpenGL缓冲区并通过glDrawElements绘制它们。

找到最短路径不是问题。问题在于顶点选择。我需要通过鼠标单击选择顶点并存储它们的ID以进行进一步处理。我有一些函数返回鼠标位置,但我找不到可以获取顶点ID或三角形ID的方法。

我还发现了关于rayPicking的方法,但是这个方法用于选择网格本身而不是它的元素。

我感谢任何帮助或想法

更新:我必须处理的网格,有大量的顶点和三角形,因此诸如为每个顶点应用唯一颜色等方法不是一个合适的解决方案。同时向每个顶点或三角形添加一个球体并计算射线与球体的交点并不是正确的方法。

2 个答案:

答案 0 :(得分:0)

我从来没有实现过这样的东西,但我会推荐另外一个渲染过程,如下所示。

  1. 为每个Vertex定义一个唯一的颜色,用于指定顶点的ID。
  2. 因为很难选择一个像素,所以尝试在它周围画一个小四边形。 glPointSize(...)可能有用。
  3. 从您渲染小四边形的纹理/帧缓冲区中读取像素的颜色。
  4. 计算颜色的顶点ID。
  5. 我听说过几个类似的三角形实现。也许你可以从中获得更多的灵感。

答案 1 :(得分:0)

从概念上讲,您可以创建另一个单独的帧缓冲区。然后将顶点ID编码为RGBA颜色值。在当前可见的帧缓冲区上绘制网格时,需要将顶点ID的编码颜色同时绘制到另一个帧缓冲区中。 选取点时,可以从另一个帧缓冲区中恢复编码的顶点ID,并对其进行解码以获得原始顶点ID。 简而言之,您需要制作另一个不可见的单独帧缓冲区以进行拾取。