我正在编写一个OpenGL应用程序,使用深度排序的透明/半透明算法。
我的第一种方法是计算所有对象的包围盒中心到相机的距离,但我发现一个包围盒可能比其他包围盒更靠近相机,但其中心点却更远。
这些包围盒的方向可以不同,因此它们的轴并未对齐。
如何正确地计算包围盒到相机的距离?
我的第一种方法是计算所有对象的包围盒中心到相机的距离,但我发现一个包围盒可能比其他包围盒更靠近相机,但其中心点却更远。
这些包围盒的方向可以不同,因此它们的轴并未对齐。
如何正确地计算包围盒到相机的距离?
对于每个定向边界框 (OBB),计算从 camera
到 centre
的距离涉及到性能开销较大的 sqrt
,因为它是欧几里得距离函数的本质;此外,你需要最接近相机的盒子,通过测量到中心的距离来解决这个问题并不太合理。
如果你知道盒子在相机空间中的顶点,将它们按 Z 值排序可以给你最接近相机的盒子。包含该点的盒子将是最接近相机的盒子。然而,由于 OBB 通常按其中心、方向和大小存储,因此人们通常不会立刻拥有盒子在相机空间中的顶点;因此,通常需要将所有盒子的所有顶点从盒子空间转换到相机空间;这可能会很耗费资源,但如果在 GPU 上执行,可能还好。
ray.origin = camera
和ray.direction = obb.centre - camera
)。每个测试会返回一个t
,表示该盒子上发生碰撞的向量上的距离;将ray
乘以t
并仅取其Z分量,基本上会给出该向量在Z轴上的投影(这将是光线击中盒子的点的Z坐标);最小Z分量的那个将是沿Z方向从相机最近的盒子。
此页面包含光线-obb测试的算法和实现;它使用了Kay-Kajiya在《Real-Time Rendering》中描述的平板方法。distance**2
而不是使用distance
来排序,而且不需要使用sqrt()
。 - gg349记住,在发出绘制命令时,您需要首先渲染其中一个对象(除非您将每个对象都拆分为单独的对象,否则无法部分绘制它们)。
在您的情况中,应首先绘制object1,并注意它沿相机轴具有最远的点。
算法简述:
P.S. 我还没有想到可能失败的情况,所以我说是近似值。