选择/ glRenderMode(GL_SELECT)

时间:2010-03-05 08:16:10

标签: opengl select

为了在OpenGL中进行对象拾取,我真的必须渲染场景两次吗?

我意识到渲染场景应该很便宜,速度为30fps。

但是如果每个选择对象都需要额外的胆量来渲染RenderScene()

那么如果我每秒点击30次,那么GPU必须渲染两次吗?

3 个答案:

答案 0 :(得分:3)

一个常见的技巧是使用两个单独的函数来渲染场景。当您处于拣选模式时,您可以渲染世界的简化版本,而不需要您不想选择的内容。因此,根本不需要渲染地形,惰性物体等。

渲染精简场景的时间应远远少于渲染完整场景的时间。即使您每秒点击30次(!),您的帧速率也不会受到太大影响。

答案 1 :(得分:2)

首先,如果你有一些模拟鼠标点击的其他代码,你每秒获得30次鼠标点击的唯一方法就是这样。对于一个人来说,每秒10次点击会非常快 - 而且他们没有机会查看他们选择的内容 - 只需要尽快点击按钮。

其次,当您使用GL_SELECT时,通常需要使用gluPickMatrix为其提供区域进行渲染,通常是(例如)10x10像素的正方形,以点击点为中心。至少在典型的情况下,绝大多数物体将完全落在该区域之外,并立即被剔除(根本不会被渲染)。在大多数情况下,这会加速渲染

答案 2 :(得分:0)

已经有一些关于如何优化GL中的选择的好建议。这可能对你有用。

但是如果你需要的性能超过你可以挤出的选择,那么你可能想要考虑做大多数游戏引擎所做的事情。由于大多数引擎已经具有某种形式的3D碰撞检测系统,因此使用它可以快得多。取消投影点击的屏幕坐标并运行光线与世界碰撞测试以查看点击的内容。您无法利用GPU,但工作量要小得多。甚至小于gl-picking所需的CPU端设置工作。

根据更简单的碰撞船体,甚至只是边界框进行选择。性能根据场景中的对象/外壳数量而不是几何量加上对象数量来缩放。