许多ShaderToy演示程序都共享Ray Marching算法来渲染场景,但是它们通常以非常紧凑的样式编写,我找不到任何简单的示例或解释。 ?一些评论表明这是“球形跟踪”的一种变体。这种方法的计算优势是什么?

#1 楼

TL; DR
它们属于同一个求解器家族,其中球体跟踪是射线行进的一种方法,即家族名称。传统的光线追踪,其中曲面函数不容易解决(或者如果不使用数值迭代方法,则不可能解决)。在光线追踪中,您只需要查找光线的交点,而在光线行进中,您可以前进(或来回)前进,直到找到交点,并有足够的样本或您要尝试解决的任何问题。尝试将其视为类似于Newton-raphson方法以进行曲面查找,或者求和以集成变化函数。
如果您需要以下操作,这将非常有用: br />渲染隐式函数,分形
渲染其他类型的参数化曲面,这些参数化曲面提前不知道交点,例如视差映射:用于表面查找的传统射线行进
相关文章:


如何进行raymarch着色器工作(GameDev.SE)

球体跟踪
球形跟踪是一种可能的射线行进算法。并非所有的光线行进都使用此方法的好处,因为它们无法转换为这种方案。隐式表面是在连续功能的某个级别上形成的。本质上是求解方程式
F(X,Y,Z) = 0

由于可以在每个点上求解该函数,因此可以继续进行估算,并估计出适合当前行进步骤的最大范围(或者如果不是很合理的话,那么安全) )。然后,您知道下一次行进距离至少要这么大。这样,您可以采用自适应光线行进步骤来加快处理过程。

图像2:实际使用的球体跟踪*请注意步长如何自适应
有关更多信息,请参见:

球体跟踪:隐式曲面的抗锯齿射线跟踪的几何方法

*也许在2D中应该称为圆跟踪:)

评论


$ \ begingroup $
我会推荐Scratchapixel的这篇文章进行深入的说明:scratchapixel.com/lessons/advanced-rendering / ...
$ \ endgroup $
–user18490
16 Dec 24'在12:54

$ \ begingroup $
@ user18490到Scratchapixel的链接已移至scratchapixel.com/lessons/advanced-rendering /...。该网站的其余部分(scratchapixel.com/index.php)看起来也很有用。
$ \ endgroup $
– WillC
18年6月21日在8:22



#2 楼

光线行进是迭代的光线相交测试,其中您沿着光线步进并测试相交,通常用于查找具有实体几何的相交,并且内部/外部测试快速。带有浮雕纹理的渲染几何图像中的图像

如果您真的不知道可能在何处发生交点,则固定步长非常普遍,但有时会使用二进制或割线搜索之类的求根方法。通常使用固定的步长来查找第一个交点,然后进行二进制搜索。我首先遇到了逐像素位移贴图技术中的射线行进。



常用于空间跳跃,这是一种加速技术,其中一些预处理可以提供安全距离,您可以沿射线移动而不与几何相交,或者更好的做法是,不与几何相交然后离开几何,以便您错过它。例如,圆锥步映射和松弛圆锥步映射。

球跟踪可能是指隐式射线-球相交测试,但它也是约翰·哈特(John Hart)提出的空间跳跃技术的名称,例如@ joojaa提到了这一点,并由William Donnelly(带距离函数的每像素位移贴图)使用,其中3D纹理编码了不存在几何体的球体半径。

评论


$ \ begingroup $
哈,走了,从别人那里拿照片比自己画照片更有效率。
$ \ endgroup $
– joojaa
15年8月10日在8:05

$ \ begingroup $
@joojaa是的,如果您还记得他们在哪里,那会更快,但是您自己却没有那种可喜的感觉:另外,我在Chrome中有一个愚蠢的子像素渲染错误,因此文本都是彩色的。
$ \ endgroup $
– jozxyqk
15年8月10日在8:44

$ \ begingroup $
子像素渲染是一个尚未被问到的问题。然而。
$ \ endgroup $
– joojaa
2015年8月10日在8:59



$ \ begingroup $
完成。
$ \ endgroup $
– jozxyqk
15年8月10日在9:41