边界框的OpenGL深度计算

时间:2014-03-24 11:22:04

标签: opengl linear-algebra

我正在编写一个使用基于深度排序的透明度/半透明算法的opengl应用程序。

我的第一种方法是计算所有物体与相机的边界框中心距离,但我意识到一个边界框可以最接近相机,但其中心距离最远。

框的方向可能不同,因此轴未对齐。

enter image description here

如何正确计算与相机的边界框距离?

2 个答案:

答案 0 :(得分:1)

由于欧几里德距离函数的性质,计算每个OBB(定向边界框)从cameracentre的距离涉及性能饥饿sqrt;你还需要距离相机最近的盒子,通过测量到中心的距离来解决问题是没有意义的。

替代方法

Z分类

如果您知道相机空间中框的顶点,则按Z对它们进行排序会得到最接近的顶点。包含该点的框将是最靠近摄像机的框。但是,由于OBB通常按其中心,方向和范围存储,因此不容易在相机空间中存在顶点;因此,它通常需要将盒子的顶点从盒子空间转换到所有盒子的所有顶点的相机空间;这将是昂贵的,也许如果在GPU上执行,它可能没问题。

交叉口测试

这是我能想到的替代方案,可能比排序更快但不太准确,就是在这些方框(ray.origin = cameraray.direction = obb.centre - camera)上执行快速的射线 - 倒钩交叉测试。每次测试都会返回t沿着向量的距离ray。使用t缩放{{1}}并仅使用其Z分量将基本上为您提供Z轴上矢量的投影(这将是光线击中框的点的Z坐标) ;具有最小Z分量的那个将是沿着Z方向离相机最近的盒子。

This page同时具有算法和ray-obb测试的实现;它使用Kay-Kajiya's slab method described in Real-Time Rendering

答案 1 :(得分:1)

最好的近似可以通过使用相机空间中最远的OBB点Z分量(相机空间中具有最高/最低Z分量的点,取决于手性)对对象进行分类,因此得到名称Z-sorting 。你也可以使用平方距离。

请记住,在发出绘图命令时,您需要首先渲染其中一个(除非将每个命令分解为单独的对象,否则不能部分绘制它们。

在你的情况下,应首先绘制object1,并注意它沿摄像机轴有最远点。

算法简而言之:

  • 将每个边界框点转换为相机空间。
  • 找到每个框的相机Z轴点的最远点。这将成为每个边界框的深度键
  • 使用找到的深度键对框进行排序。
  • 将对象拉回到前面。

<子> P.S。我还没想到这可能会失败的情况,这就是我说近似的原因。