0

我在学习Raymarching时遇到了一个很奇怪的问题。我的方程不能很好地显示。在matlab中可以很好的显示出来。但它根本无法在 Shadertoy 上显示。

我的方程式:</p>

f(x,y,z) = (x^2+y^2+z^2)^2+2*y*(x^2+y^2+z^2)+2*(x^2+z^2);

matlab中的代码:

f =@(x,y,z) (x.^2+y.^2+z.^2)^2+2*y*(x.^2+y.^2+z.^2)+2*(x.^2+z.^2);
fimplicit3(f)

matlab显示正常图片

shadertoy中的代码:</p>

float sdRound(vec3 p)
{
   float lengthXYZ = (p.x * p.x+p.y * p.y+p.z * p.z); 
   return lengthXYZ * lengthXYZ+2.0 * p.y * lengthXYZ+2.0 * (p.x * p.x+p.z * p.z);
}

我学习、练习和修改了 iq 代码。(https://www.shadertoy.com/view/Xds3zN)。

但是不能正常显示。 Shadertoy显示异常图片 Shadertoy显示异常图片

我不知道问题出在哪里。请帮我。困扰我很久了。

原谅我糟糕的英语。我用谷歌翻译。

4

1 回答 1

0

您的问题似乎在于对 raymarching 的理解。
您的公式在数学上描述了一个表面(这就是它在 matlab 中很好地显示的原因),但这不是 raymarching 的工作原理。
为光线追踪定义一个对象意味着为您的对象定义一个距离函数(这与数学上描述其表面的函数不同)。这些函数对于返回零的值是相同的(这意味着坐标在表面上),但对于其他值它们是不同的。
要创建与您的对象类似的东西,我建议从iq 的 Raymarching 原语sdRoundCone中探索该方法,因为它似乎最接近您想要实现的目标。

于 2022-02-09T15:40:02.157 回答