光线行进的特征之一是,您可以使用模数无限重复形状,如下图所示,该图像来自https://www.shadertoy.com/view/MsBGW1 br />
我很好奇,是否有任何一种技术可以让您使用射线追踪而不是射线行进来做同样的事情?从上方绘制平面,然后在击中该平面的位置上计算该平面上网格的位置,然后使用该网格单元中的相对位置作为光线跟踪场景的绝对位置。这将在整个网格上重复场景。不能捕捉其他形状,而不必沿着网格路径沿着射线的路径走,直到它离开网格的背面为止,这非常像射线行进式的并且是迭代的。

有人知道吗技术,使您可以在光线跟踪中进行光线行进类型的重复?

#1 楼

我也试图弄清楚这一点,但是我不认为有一种解决方案能像跟踪一个领域一样出色。基本上,您将希望投射一条射线以击中无数重复的球体而没有行进迭代。那太棒了,但不可能:让我解释一下。



光线跟踪基本上是在寻找该方程的解析解:
$$
f(\ vec {r(t)})= 0 \ for \ t
$$

其中$ f(\ vec {p})$是隐式曲面函数(给出给定点$ \ vec {p} $距表面的距离),$ \ vec {r(t)} $是参数射线方程式($ \ vec {r(t)} = \ vec {origin } + \ vec {direction} * t $)。 $ t $表示相交发生时沿射线的距离。

为了射线跟踪域操作(如重复空间),这些域操作需要出现在隐式曲面函数$ f中(\ vec {p})$,同时找到分析解决方案。让我们以3D重复球体为例。
$$
f'(\ vec {p})= \ | \ vec {p} \ bmod \ vec {d} \ | -r
$$
(其中$ \ vec {d} $是代表网格大小的常量,$ r $是半径)

为了求解$ f '(\ vec {r(t)})= 0 $对于$ t $,我们将需要模运算符的逆,该模运算符实际上并不存在:http://mathforum.org/library/drmath/view/51619。 html。这意味着该方程式没有解析解,但有一个数值解。因此,光线行进。



这对于在shadertoy.com上看到的许多凉爽距离函数是正确的,这些表面不存在解析解,因此您不能射线跟踪。

评论


$ \ begingroup $
感谢您的回答!有趣的是,由于Twitter上某人的一些想法,我在此方面取得了有限的成功。我正在尝试更多的最终信息和博客文章,并将在此处提供详细答案。这不是一个通用的解决方案,但还是有点有趣。也许可以扩展。也有一个朋友提到他通过数学上的伪模数(例如使用有限的锯齿波)能够成功取得其他有限的成就。出于好奇,我将在下一条评论中分享一些阴影链接。
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
16-10-26在17:30

$ \ begingroup $
塞比(Sebbi)的Shadertoy展示了他的想法:shadertoy.com/view/lly3Rc我正在探索并进行形式化的一些事情:shadertoy.com/view/MlK3zt射线与同心圆的无限层的有限成功:shadertoy.com/view/4tyGDK我目前正在研究ray与无限重复的支柱。到目前为止看起来很有希望。最后,这些事情很有趣,但总的来说不是很有用。也许可以扩展。 ::耸肩::
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
16-10-26在17:34

$ \ begingroup $
关于模数需要进行逆运算,形式为:i = 3N,其中N在Z中,为i%3 = 0的逆。如果我们有该形式的解,我们可以插入N的值,大概是0?
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
16-10-26在19:46

$ \ begingroup $
但是你不能作弊吗。您可以在多维数据集上进行光线投射,并解决多维数据集边缘的哪一部分撞击哪个球体的问题。
$ \ endgroup $
– joojaa
19/12/11在19:09

$ \ begingroup $
@joojaa,如果您谈论的是立方体贴图存储的无穷大球体可以工作,但是我设计了一个迭代过程,该过程类似于光线穿过“门户”(除位置而不是方向以外的镜像)行进,它得到的图像完全相同对虚构对象使用经典的递归光线跟踪算法。
$ \ endgroup $
– cmarangu
20-2-9在4:52

#2 楼

如果要像在光线无限的球体示例中那样扭曲空间,

q真正的要做的就是将空间变成圆柱形并扭曲空间。这意味着您需要进行制造,以使如果光线撞击墙壁,该墙壁就像通向其对面墙壁的门户,并且会从对面墙壁的同一点出来。为此,您可以在此处输入一些伪代码:

float SDF (vec3 p) {
    p = mod(p+3., 6.)-3.;
    return length(p-vec3(0., 0., 0.))-2.;
}


注意,要做足够的时间使其看起来无限,您将需要数千次递归迭代可能很慢,并且无论哪种语言都可能不允许,因此您的另一选择是使用某种for循环,因为每个门户/墙交叉点仅需要base-1递归,因此可以轻松转换为迭代

并且我不会要求投票,而是要求发现我的答案无益的人详细说明如何改进它;如果某人真的有兴趣在实践中看到这一概念的证明,那么我会提供一个证明,但是直到事实如此,我才不会浪费时间。

评论


$ \ begingroup $
这是事实,值得提出答案。不言而喻的(很抱歉,我会编辑)的目标是找到一些非迭代的东西。
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
19年12月2日,下午3:21

$ \ begingroup $
哦。在那种情况下,很值得研究这个线程,了解投影的立方晶格,复数和多项式之间的某种奇怪的联系twitter.com/stevejtrettel/status/1192827919447547905
$ \ endgroup $
– cmarangu
19/12/3在13:32

$ \ begingroup $
非常有趣!
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
19/12/3在14:38