边界框的OpenGL深度计算

Rob*_*ias 5 opengl linear-algebra

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

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

盒子的方向可以不同,因此轴不对齐.

在此输入图像描述

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

leg*_*s2k 1

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

替代方法

Z-排序

如果您知道相机空间中盒子的顶点,则按 Z 对它们进行排序将为您提供最接近的顶点。包含该点的框将是距离相机最近的框。然而,由于 OBB 通常按其中心、方向和范围存储,因此不容易在相机空间中获得顶点;因此,对于所有盒子的所有顶点,通常需要将盒子的顶点从盒子空间变换到相机空间;这会是昂贵的,如果在 GPU 上执行,也许还可以。

交叉口测试

这是我能想到的替代方案,可能比排序更快但不太准确,是对这些框(使用 和ray.origin = camera)执行快速光线-obb 相交测试ray.direction = obb.centre - camera。每个测试都会返回一个t沿着矢量的距离,该距离发生在该框上;缩放rayt仅取其 Z 分量本质上会给出向量在 Z 轴上的投影(这将是光线击中盒子的点的 Z 坐标);Z 分量最小的盒子将是沿 Z 方向距离相机最近的盒子。

该页面既有ray-obb测试的算法,也有实现;它使用实时渲染中描述的 Kay-Kajiya 的板方法

  • 您可以通过“distance**2”排序,而不是使用“distance”,而不使用“sqrt()”。 (2认同)