Hash 柏林噪声如何从排列数组中得到向量?

Hash 柏林噪声如何从排列数组中得到向量?,hash,gradient,permutation,perlin-noise,Hash,Gradient,Permutation,Perlin Noise,我目前正在尝试在二维HLSL上实现柏林噪声。我看了,但我不明白从置换数组到向量的转换是如何工作的。 我知道我可以得到这样的散列码 int g00 = p[floorX + p[floorY]], g10 = p[floorX + 1 + p[floorY]], g01 = p[floorX + p[floorY + 1]], g11 = p[floorX + 1 + p[floorY + 1]]; (floorX和floorY是分解为8位的地板x、y坐标。) 是的,但我

我目前正在尝试在二维HLSL上实现柏林噪声。我看了,但我不明白从置换数组到向量的转换是如何工作的。 我知道我可以得到这样的散列码

int g00 = p[floorX + p[floorY]],
    g10 = p[floorX + 1 + p[floorY]],
    g01 = p[floorX + p[floorY + 1]],
    g11 = p[floorX + 1 + p[floorY + 1]];
(floorX和floorY是分解为8位的地板x、y坐标。)

是的,但我还是不明白。我也不明白Ken实现中的“grad(…)”方法是如何工作的。
有人能解释一下它是如何工作的吗?

Ken Perlin的实际java实现实际上是他的GPU实现的伪代码,这意味着某些部分(尤其是您一直停留在上面的部分)是完全无法穿透的(使用一些优化理论)

为了可读性, 试试Stefan Gustavson在Simplex Noise Demystified(2005)中的参考java实现,它更清晰,因为它部分是作为教学工具设计的

在他的grad()函数中,有一长串的位操作和条件(使用三元简写运算符)用于选择伪随机单位向量。特别是,它应该从一组均匀分布在单位圆(2D)或球体(由立方体侧面的中点近似,3D)等周围的集合中进行选择,并且每个集合的概率相等。 如果散列例程对最低4位进行了充分的置乱,那么这16个选项可以快速映射到12个最佳3D向量(长度为sqrt2)——这就是它所做的(还有,imho,为什么柏林噪声很少达到他在随附论文中提出的标准)

特别是,他对伪随机选择的两个轴单位向量(x、y和z)求和,每个向量都有伪随机确定的符号

由于您需要2D噪波,我建议您对渐变本身使用一个查找表,但请使它们的长度相同(它看起来比附录中的快捷方式Perlin要好一点,该快捷方式在任何地方都复制过,而且向量通常已经是浮动的)。实际上,您可以选择8个良好的基渐变(因此按位置乱可以在不变形的情况下工作!)