在OpenGL中进行3D拾取

时间:2015-11-14 15:10:39

标签: opengl graphics

是否有"标准" 3D采摘方法?大多数游戏公司做什么? (准确挑选)

我认为最快的方法是使用gpu并使用"颜色索引"渲染每个对象,然后使用glReadPixels(),但后来我听说它已被考虑由于glFlush()glFinish()来电,因此速度很慢。

还有这种光线投射方法,由于球体/ AABB近似,这种方法很好但不准确。

1 个答案:

答案 0 :(得分:2)

有关什么是"标准"可能会引用一些固执的回答,但我会建议最接近"标准"这是光线投射。

采用防水光线/三角形交叉功能,测试从鼠标光标位置未投影的光线对着场景中的三角形。

通常这会很慢,需要线性复杂性。因此,下一步是将其加速到更好的状态,如对数时间。这通常通过诸如八叉树,BVH,K-D树或BSP的数据结构来实现。有时候人们会跳过这一步,只是尝试让ray / tri交叉点非常快且非常平行,甚至可能使用GPGPU。

预先比基于帧缓冲的解决方案需要更多的工作,但复杂的应用程序倾向于采用这种方式可能是因为:

  1. 可移植性:它与渲染引擎分离。它不必与OpenGL或DirectX绑定,例如,这可以提高可移植性。
  2. 一般性:通常,其他事物需要加速器和相关查询。例如,FPS游戏可能会让玩家和敌人不断相互射击。弄清楚什么射弹会发生什么往往需要这些类型的交叉查询不断发生,而不仅仅是从统一的视角出发。
  3. 简单性:开发人员可以预先承担额外的工作,以便以后简化工作。
  4.   

    还有这种光线投射方法,这很好但不是   因球体/ AABB近似而准确。

    使用AABB或边界球体加速目的应该没有什么不准确之处。这些纯粹是为了加速测试并迅速减少需要通过进行更便宜的测试而需要发生的更昂贵的射线/三角形交叉点的数量,以及消除大批量三角形以进行批量检查的数量。通常它们应该被构造成包含场景中的元素。如果您首先进行射线/ AABB交叉,例如,如果击中,则测试AABB中包含的元素。任何加速结构在没有加速器的情况下都没有给出相同的结果,这通常是一个小问题。

    例如,一种非常基本的加速形式只是在场景中的一个网格元素周围放置一个边界框,就像一个角色一样,有时这种基本形式不涉及一个完整的加速器可能对于非常动态的元素有用。场景(避免不断更新加速器的成本)。如果光线与角色的边界框相交,则检查构成角色的所有三角形。只要你之后检查AABB中的三角形,它就变成了加速度而不是近似值。当然,如果你只检查了AABB而没有别的,那么这将是一个粗略的近似值。