首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么单纯形噪声似乎比经典的Perlin噪声有更多的*工件?

为什么单纯形噪声似乎比经典的Perlin噪声有更多的*工件?
EN

Stack Overflow用户
提问于 2013-09-19 02:41:23
回答 2查看 9.1K关注 0票数 21

我读过Stefan Gustavson关于单纯形噪声的优秀论文,其中我被许诺:

单纯形噪声没有明显的方向伪影。

与“经典”的Perlin噪音形成对比。我兴奋地执行它,发现相反的情况似乎是正确的。我确实在经典噪声中看到了伪影,但我看到至少有同样多的工件在单纯形噪声中,在45度与主轴对齐。当您将噪声映射到step函数时,它们特别明显。

为了确保我的实现没有问题,我使用了其他人的JavaScript实现。比较一些图像:

还有这是一个画廊和所有的人。在最后一张图像中,寻找从水平/垂直方向45度对齐的边框。他们到处都是。如果需要的话,我可以强调其中的一些,但在我看来,它们确实是显而易见的。(同样,我也在经典的噪声图像中看到了它们。)

编辑:为了更定量,我取样了100万个随机点,对每一个点,我对经典和单纯形噪声的梯度进行了数值计算,并取了一个https://i.imgur.com/gLy8Dt6.png。如果没有定向伪影,图形将是平坦的。但是你可以看到,经典的和单纯的噪音每45度就会上升一次。

这是单纯形噪声算法的问题吗?它是可以修复的东西吗?还是只有我一个人认为这是个问题?

EN

回答 2

Stack Overflow用户

发布于 2014-02-05 04:38:47

我刚看了报纸,我想我知道是什么导致了这些文物。网格的每个顶点的梯度是从一个相当小的查找表中伪选择的。正如古斯塔夫森在第3页所述:

“对于2D或更高的区域,一个很好的选择是选择单位长度但方向不同的梯度。对于分布在单位圆周围的2D、8或16梯度是一个很好的选择。”

这是在经典的Perlin噪声中使用的方法,这是而不是 Perlin在他的2001年论文中为单纯形噪声提出的方法,第14页:

新方法不使用表查找方案来计算每个周围顶点的伪随机梯度的索引,而是使用一种只使用极少数硬件门的位操作方案。

然而,古斯塔夫森在第7页上说:

“为了清晰起见,我将使用混合方法,使用传统噪声中的梯度散列法,但采用单纯形网格和单纯形噪声的直接加和。这在软件中实际上是一种更快的方法。”

他的2D实现实际上使用了3D梯度表中的12个梯度,放弃了z坐标。在该方案中,边坐标每个使用两次,但角只使用一次,这似乎在90度间隔引入了一个偏差。但这与你的情况无关,因为你使用的实现只有8个梯度,很可能在45度间隔内存在偏差。从如此微小的差异中出现可见模式的可能性似乎相当高。但是,使用mod 16置换表可以很容易地将该算法用于16梯度,这将有助于显著减少定向伪影。

但最终,我认为任何梯度噪声函数的单个八度都会出现一些可见的模式,仅仅是因为它们受设计的限制,因为频率的窄范围将倾向于使扰动与网格相一致。作为一个三角形网格,即使梯度确实是随机的,单纯形噪声在60度间隔内也可能会出现一些偏差。嗯,这只是猜测,但重点是这些噪声函数实际上是设计成在不同频率下组合的,这往往会打破你在一个八度音阶中可能看到的任何模式。

编辑:

我刚刚意识到的另一点,像(1,1)这样的角梯度不是单位长度,它们是sqrt(2)。第一个引文明确指出,梯度应该位于单位圆上。这可能是另一个偏见的来源。有趣的是,古斯塔夫森也使用这些非单位梯度。

票数 29
EN

Stack Overflow用户

发布于 2013-09-24 03:01:59

perlin噪声的值噪声版本也会产生直线,而渐变噪声版本的perlin会产生稍圆的东西,所以您可能有一个单纯形的值噪声实现,而不是梯度版本。

否则,代码中的插值梯度是错误的,因为它在象限之间产生角度转换。在线上似乎可以说,单纯形噪声不仅速度更快,而且梯度更圆。

我把它解释为插值曲线的角度是圆的。也许有人说过肯·佩林斯的说法,他只是说梯度包含了较少的抖动(很抱歉使用了错误的描述),因为代码实际上并没有产生像窦一样的完美的数学曲线,如果你把许多Perlin相乘,我发现抖动/曲线的不规则性很强,足以测量,而正弦波和数学函数的情况并非如此。所以你可以在网上研究其他人对单纯形噪声梯度的评论。

我认为这里有一个梯度查找表,在你的例子中,它似乎经常上升到45‘,否则你在2点之间使用的分级曲线离理想的正弦曲线太远了,它会产生圆形和没有直线,但计算不那么容易,特别是在CPU上。在GPU上,我认为窦性梯度比多项式梯度曲线更快是合理的。

你是否也检查了你的单纯形的动荡和多重分形等版本?在任何一种情况下,它们都是大约5行,表示噪声函数是如何运行的,并且每次返回非常不同的结果。

刮板博客中GPU的改进Perlin噪声

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18885440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档