使用glDrawElements时在OpenGL核心配置文件中选取三角形

时间:2012-01-31 12:15:06

标签: opengl glsl opengl-3

我使用glDrawElements绘制三角形网格,并希望能够使用鼠标单击选择/选择三角形。三角形的网格可能非常大。

在固定功能OpenGL中,可以使用GL_SELECT: http://content.gpwiki.org/index.php/OpenGL:Tutorials:Picking ..但我只对使用OpenGL核心配置文件感兴趣。

另一种可能性是使用'颜色编码':

http://www.lighthouse3d.com/opengl/picking/index.php?color1

http://www.opengl.org/resources/faq/technical/selection.htm

..但据我所知,使用glDrawElements时无法指示每个三角形信息?

最后,我可以通过鼠标位置拍摄拾取光线来进行基于CPU的拾取,但这会非常慢,因为我想我必须转换CPU上的三角形,所以我更喜欢基于GPU的解决方案。 / p>

在OpenGL核心配置文件中使用glDrawElements时,是否有人建议选择哪种方法?

3 个答案:

答案 0 :(得分:5)

关于'颜色编码'方法,您可以使用gl_PrimitiveID使用适当的片段着色器填充颜色编码缓冲区,这基本上可以为您提供绘制三角形的索引。

关于基于CPU的选择,您可以使用处理加速结构的现有库和光线网格交集,例如BulletOpcode

“最佳”选项取决于您的使用案例,很难说清楚。

答案 1 :(得分:3)

尝试从这个角度看待它:OpenGL仅用于绘制内容。采摘应该以另一种方式进行。如果您坚持使用OpenGL(并非不合理),请使用带有整数16位单通道颜色缓冲附件的FBO,您可以在其中呈现对象ID。拣配减少以读取ID的一个像素。

  

最后,我可以通过鼠标位置拍摄拾取光线来进行基于CPU的拾取,但这会非常慢,因为我想我必须转换CPU上的三角形,所以我更喜欢基于GPU的解决方案。 / p>

我推荐这个。但是,不是变换所有三角形,而是反向变换您的一个拾取光线。无论如何,您应该在某个空间细分结构中管理您的场景,因此对此进行测试应该是微不足道的。

答案 2 :(得分:2)

您确实可以在DrawElements调用中提供每个三角形信息。然后,您必须提供相应的数组(前一个COLOR_ARRAY,TEXTURE_COORD_ARRAY等,现在通常称为VertexAttribArrays)。 如果您坚持使用GPU,这可能是最简单的解决方案。

但是,通常的方法是从点击点向场景发射光线。因此,您需要做的不是转换每个三角形,而是计算 光线和三角形之间的相交测试。如果光线相交,你会碰到它, 如果不是你没有。如果你这样做的话,这确实可能会付出相当大的代价。

但是,通常你会将三角形包含在某个空间数据结构中(即你的场景图将/可以/应该有几个表示),如八叉树(http://en.wikipedia.org/wiki/Octree)例如。这将允许碰撞响应 在很多测试中。此外,您可以考虑三角形在屏幕上占据的最终尺寸(因此选择子像素三角形将毫无意义 大多数情况下。)

如果你真的想要获得幻想,你也可以将整个过程放到GPU上(一个听起来很有趣的例子是http://blog.xeolabs.com/ray-picking-in-scenejs,但是当你使用谷歌时会有更多的出现)。

我个人最容易实现的是解决方案b)软件Ray Picking,然后a)最后GPU选择。如果您觉得它不够快,那么最简单的开始,改进。不要过早地进行优化(例如光线投射拾取在我的iPhone上完美运行;)。你的挑选算法玩得开心,祝你好运。