许多ShaderToy演示程序共享Ray Marching算法来渲染场景,但是它们通常以非常紧凑的样式编写,我找不到任何简单的示例或解释。
那么,雷·马兴(Ray Marching)是什么?一些评论表明这是“球形跟踪”的一种变体。这种方法的计算优势是什么?
许多ShaderToy演示程序共享Ray Marching算法来渲染场景,但是它们通常以非常紧凑的样式编写,我找不到任何简单的示例或解释。
那么,雷·马兴(Ray Marching)是什么?一些评论表明这是“球形跟踪”的一种变体。这种方法的计算优势是什么?
Answers:
它们属于同一个求解器家族,其中球体跟踪是射线行进的一种方法,即家族名称。
射线行进是一种与传统射线跟踪类似的技术,在该技术中,表面函数不容易解决(或者如果没有数字迭代方法,则不可能解决)。在光线追踪中,您只需要查找光线的交点,而在光线行进中,您可以前进(或来回)前进,直到找到交点,并有足够的样本或您要尝试解决的任何问题。尝试将其认为是用于表面查找的牛顿拉普森方法,或求积分以集成变化的函数。
如果您执行以下操作,这可能会很有用:
图片1:传统射线行进进行表面寻找
相关文章:
球跟踪是一种可能的射线行进算法。并非所有的光线行进都使用这种方法的好处,因为它们无法转换为这种方案。
球面跟踪用于渲染隐式曲面。隐式表面是在连续功能的某个级别上形成的。本质上解决方程
F(X,Y,Z) = 0
由于如何在每个点上都可以解决此功能,因此可以继续进行估算,以适合当前的行进步骤(或者如果不是十分合理的话)。然后,您知道下一次行进距离至少要这么大。这样,您可以采用自适应光线行进步骤来加快过程。
图2:实际的球体跟踪*,注意步长如何自适应
有关更多信息,请参见:
*也许在2D中应该称为圆跟踪:)
射线行进是一种迭代的射线相交测试,您可以沿着光线进行步进并测试相交,通常用于查找具有实体几何的相交,其中内部/外部测试快速。
如果您真的不知道可能在何处发生交点,则固定步长是很常见的,但是有时会使用诸如二进制或割线搜索之类的求根方法。通常使用固定的步长来查找第一个交点,然后进行二进制搜索。我首先遇到了逐像素位移贴图技术中的射线行进。非高度场表面细节的浮雕贴图是一本好书!
它通常与空间跳跃一起使用,这是一种加速技术,其中一些预处理可以提供一个安全距离,使您可以沿射线移动而不会与几何图形相交,或者更好的是,没有相交然后离开几何图形,以便您错过它。例如,圆锥步映射和松弛圆锥步映射。
球面追踪可能是指隐式射线-球面相交测试,但这也是约翰·哈特(@ Harojaa)提到的约翰·哈特(John Hart)的空间跳跃技术的名称,并由威廉·唐纳利(William Donnelly)使用(具有距离函数的按像素位移映射),其中3D纹理编码不存在几何形状的球体半径。