我正在编写一个使用基于深度排序的透明度/半透明算法的opengl应用程序。
我的第一种方法是计算所有物体与相机的边界框中心距离,但我意识到一个边界框可以最接近相机,但其中心距离最远。
框的方向可能不同,因此轴未对齐。
如何正确计算与相机的边界框距离?
答案 0 :(得分:1)
由于欧几里德距离函数的性质,计算每个OBB(定向边界框)从camera
到centre
的距离涉及性能饥饿sqrt
;你还需要距离相机最近的盒子,通过测量到中心的距离来解决问题是没有意义的。
如果您知道相机空间中框的顶点,则按Z对它们进行排序会得到最接近的顶点。包含该点的框将是最靠近摄像机的框。但是,由于OBB通常按其中心,方向和范围存储,因此不容易在相机空间中存在顶点;因此,它通常需要将盒子的顶点从盒子空间转换到所有盒子的所有顶点的相机空间;这将是昂贵的,也许如果在GPU上执行,它可能没问题。
这是我能想到的替代方案,可能比排序更快但不太准确,就是在这些方框(ray.origin = camera
和ray.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,并注意它沿摄像机轴有最远点。
算法简而言之:
<子> P.S。我还没想到这可能会失败的情况,这就是我说近似的原因。