.net 柏林噪声插值

.net 柏林噪声插值,.net,f#,perlin-noise,noise-generator,.net,F#,Perlin Noise,Noise Generator,我一直在使用and编写F#中的柏林噪声发生器,在算法的插值部分之前一直是成功的。这是目前为止的工作代码(您可能不需要阅读下面的2个代码块,因为它们只是用于上下文,所以不要害怕): 我知道这有很多需要理解的地方,但是上面给出的代码没有一个是错误的;它的工作原理与预期一样,可以生成这样的不完整图像(只是缺少一些): 这就是我为插值所想到的(仅其他代码+此代码,删除average3D调用作为结果): 这样的结果看起来更糟: 我认为你基本上只需要对每个轴进行插值——在3D的情况下,所有4个z轴,比如说

我一直在使用and编写F#中的柏林噪声发生器,在算法的插值部分之前一直是成功的。这是目前为止的工作代码(您可能不需要阅读下面的2个代码块,因为它们只是用于上下文,所以不要害怕):

我知道这有很多需要理解的地方,但是上面给出的代码没有一个是错误的;它的工作原理与预期一样,可以生成这样的不完整图像(只是缺少一些):

这就是我为插值所想到的(仅其他代码+此代码,删除average3D调用作为结果):

这样的结果看起来更糟:

我认为你基本上只需要对每个轴进行插值——在3D的情况下,所有4个z轴,比如说,然后是2个x轴,最后是y轴,以得到最终值。而且它似乎不起作用。我一定是误会了什么;它就是不起作用!也许我的插值函数错了。也许我的应用是错误的。谢谢你的帮助。即使是一个关于你应该怎么做的解释——对于最后一步,大多数其他来源都会这样说,“然后把这些点积插值在一起,得到最终的值。”

PS:我使用的是游戏库Axiom(食人魔的一个C#port)中的结构,主要是Vector3,所以我定义了一个
@
操作符,该操作符在整个代码中使用,用于轻松创建Vector3,如下所示:
1@@2@@3
from

11.1.3法向量插值-该技术使用类似的插值方法,不同的是在整个 多边形是曲面法向量,而不是计算的 强度本身。(此方法也称为Phong插值。) 顶点法线的计算方法与强度插值中的方法相同 方法。再次参考图11.2,表示正常 点P处的向量作为NP,我们有

NQ =  u*NB+(1-u)NA,  where  u=  AQ/AB 
NR =  w*NB+(1-w)NC,  where  w=  CR/CB 
NP =  v*NR+(1-v)NQ,  where  v=  QP/QR 
法向量也可以增量确定

结果比强度插值更真实 方法,特别是当考虑镜面反射时 高光的渲染更加忠实,马赫带也大大减少 减少(但球体和圆柱体仍倾向于马赫带 效果)

这种方法的缺点是需要进行更多的计算才能实现 处理多边形中的每个插值点;在每一点上 必须使用插值函数执行完整的着色计算 在那一点上是正常的

11.1.4点积插值-该方法是强度插值和法向量插值之间的折衷方法。这里,这个 从扫描线一端插入到另一端的量为 点积N·L和(R·V)N。这种方法有时被称为 “廉价电话”插值


你可能需要阅读整篇文章才能获得足够的上下文来理解这些方程。

Oops,愚蠢的错误。ChangingI会更改它,但我必须更改至少5个字符才能更改帖子。等等,你在说什么?这实际上是F,而不是C。(我把它倒过来读了,因此消除了我使用C标记的合法错误)我以为你的意思是,它是用C语言编程的,不小心输入了F拼写错误,但后来我意识到代码不是C。没有伤害!
let yE=(interp(xE1,Sy),interp(xE2,Sx))
是打字错误吗?看起来应该是这样的:
let yE=(interp(xE1,Sx),interp(xE2,Sx))
;我已经在尝试使用线性插值,正如我在读的两篇文章中所建议的那样。我真的只需要知道我是否用错了,如果是的话,如何修正。所以这不是一个特别适合这种问题的地方。嗯,那会是什么?有没有其他SE站点适合这样做?我不确定在哪里可以找到免费的调试帮助。这不是一个bug,我想我只是在这里使用了错误的插值(好吧,我想这在技术上是一个bug:P)。这是一个理解的问题;我甚至不知道为什么在柏林噪声中使用插值——我知道插值是什么,它通常用于什么。
// PerlinNoiseProvider3D.fs
// ...
let interp((a: float, b), axis) = a + (axis * (b - a))
let Sx, Sy, Sz = S <| float v.x, S <| float v.y, S <| float v.z
let zE1, zE2, zE3, zE4 =
  (influences.[0, 0, 0], influences.[0, 0, 1]),
  (influences.[0, 1, 0], influences.[0, 1, 1]),
  (influences.[1, 0, 0], influences.[1, 0, 1]),
  (influences.[1, 1, 0], influences.[1, 1, 1])
// Interpolate the points along the z-axis
let xE1, xE2 =
  (interp(zE1, Sz), interp(zE2, Sz)),
  (interp(zE3, Sz), interp(zE4, Sz))
// Interpolate the edges along the x-axis
let yE = (interp(xE1, Sx), interp(xE2, Sx))
// And finally, interpolate the y edge to yield our final value
interp(yE, Sy)
// Ops.fs
// ..
// Ease curve
let ease p = (3.0 * (p ** 2.0)) - (2.0 * (p ** 3.0))
let S x = ease (x - (floor x))
NQ =  u*NB+(1-u)NA,  where  u=  AQ/AB 
NR =  w*NB+(1-w)NC,  where  w=  CR/CB 
NP =  v*NR+(1-v)NQ,  where  v=  QP/QR