如何使用OpenGL进行3D选择/拾取

时间:2011-08-22 17:23:18

标签: opengl

我在场景中有一些物体,有些可能遮挡其他物体。当我单击鼠标或拖动选择以获得选择矩形时,我想从这个角度选择/选择我能看到的对象。应用程序当前使用GL_SELECT渲染模式,但正如我们所知,它也选择了被遮挡的对象。另外,我读到这在OpenGL 3中已被弃用。

目前有两种方法对我很有吸引力。首先是使用Back Buffer进行对象选择(红皮书,第14章):将每个对象的颜色设置为它的对象id,并从后帧缓冲区读取像素的颜色。第二个是遮挡查询(超级,第4版,第13章)。

我已经排除的其他方法是查看选择缓冲区中的最小/最大z值并在GL之外进行自定义光线/对象检测。

我有一些问题: 1)如果在最近的OpenGL中弃用GL_SELECT,开发人员应该使用哪些替代方案? 2)我只读过有关用于加速渲染的遮挡查询。它们可以用于选择/拣选,有缺点吗? 3)现有的应用程序有一些glColorXXX调用。如果我使用后缓冲区路由并使用glColorMask(FALSE,FALSE,FALSE,FALSE),这会有效地将glColourXXX调用转换为无效的调用,从而让我在选择模式下渲染时可以在一个地方控制颜色? 4)哪条路线最好/规范?

1 个答案:

答案 0 :(得分:3)

我决定使用后台缓冲区来实现选择。这是我尝试回答我的问题:

如果在最近的OpenGL中弃用GL_SELECT,开发人员应该使用哪些替代方案?
我认为最好不要使用OpenGL来完成这项任务,而是使用空间加速结构作为用户chamber85在原始问题的评论中提出。

我只读过有关用于加速渲染的遮挡查询。它们可以用于选择/拣选,有缺点吗?
我敢肯定他们可以但是在绘制之前需要知道他们想要查询遮挡的所有对象。使用后台缓冲区和颜色选择,可以看到光标下或矩形区域内的内容并从中进行过滤。

现有的应用程序有一些glColorXXX调用。如果我使用后缓冲区路由并使用glColorMask(FALSE,FALSE,FALSE,FALSE),这会有效地将glColorXXX调用转换为无效的调用,从而让我在选择模式下渲染时可以在一个地方控制颜色吗
答案是不。使用所有GL_FALSE参数调用glColorMask()将意味着不会接受glColor3ub()调用(例如)。它只是在将颜色写入颜色缓冲区之前指定颜色的过滤器/掩码。最初的想法是将颜色设置为对象id,然后调用glColorMask()忽略所有后续的glColorXXX()调用。这种策略注定要失败,因为表示对象id的颜色也会被掩盖掉。

4)哪条路线最好/规范? 我会说后面的缓冲区颜色选择通常最好,因为它不需要在绘制之前/期间设置遮挡查询。

相关问题