.net 柏林噪声插值
我一直在使用and编写F#中的柏林噪声发生器,在算法的插值部分之前一直是成功的。这是目前为止的工作代码(您可能不需要阅读下面的2个代码块,因为它们只是用于上下文,所以不要害怕): 我知道这有很多需要理解的地方,但是上面给出的代码没有一个是错误的;它的工作原理与预期一样,可以生成这样的不完整图像(只是缺少一些): 这就是我为插值所想到的(仅其他代码+此代码,删除average3D调用作为结果): 这样的结果看起来更糟: 我认为你基本上只需要对每个轴进行插值——在3D的情况下,所有4个z轴,比如说,然后是2个x轴,最后是y轴,以得到最终值。而且它似乎不起作用。我一定是误会了什么;它就是不起作用!也许我的插值函数错了。也许我的应用是错误的。谢谢你的帮助。即使是一个关于你应该怎么做的解释——对于最后一步,大多数其他来源都会这样说,“然后把这些点积插值在一起,得到最终的值。” PS:我使用的是游戏库Axiom(食人魔的一个C#port)中的结构,主要是Vector3,所以我定义了一个.net 柏林噪声插值,.net,f#,perlin-noise,noise-generator,.net,F#,Perlin Noise,Noise Generator,我一直在使用and编写F#中的柏林噪声发生器,在算法的插值部分之前一直是成功的。这是目前为止的工作代码(您可能不需要阅读下面的2个代码块,因为它们只是用于上下文,所以不要害怕): 我知道这有很多需要理解的地方,但是上面给出的代码没有一个是错误的;它的工作原理与预期一样,可以生成这样的不完整图像(只是缺少一些): 这就是我为插值所想到的(仅其他代码+此代码,删除average3D调用作为结果): 这样的结果看起来更糟: 我认为你基本上只需要对每个轴进行插值——在3D的情况下,所有4个z轴,比如说
@
操作符,该操作符在整个代码中使用,用于轻松创建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