C++ 平铺噪音?

C++ 平铺噪音?,c++,c,algorithm,textures,procedural,C++,C,Algorithm,Textures,Procedural,作为一个爱好者,我一直对伪随机噪声产生感兴趣,特别是柏林算法和单纯形算法。Simplex的优点是速度快(尤其是在更高的维度上),但柏林柏林可以相对容易地平铺。我想知道是否有人知道平铺单纯形算法?固定尺寸好,通用性好;伪代码很好,c/c++更好。我最近需要平铺单纯形噪波,遇到了这个问题 对于使用任何噪波函数的平铺噪波,可以线性插值其他平铺采样: Ftileable(x, y) = ( F(x, y) * (w - x) * (h - y) + F(x - w, y)

作为一个爱好者,我一直对伪随机噪声产生感兴趣,特别是柏林算法和单纯形算法。Simplex的优点是速度快(尤其是在更高的维度上),但柏林柏林可以相对容易地平铺。我想知道是否有人知道平铺单纯形算法?固定尺寸好,通用性好;伪代码很好,c/c++更好。

我最近需要平铺单纯形噪波,遇到了这个问题

对于使用任何噪波函数的平铺噪波,可以线性插值其他平铺采样:

Ftileable(x, y) = ( 
       F(x, y) * (w - x) * (h - y) + 
       F(x - w, y) * (x) * (h - y) + 
       F(x - w, y - h) * (x) * (y) + 
       F(x, y - h) * (w - x) * (y)
) / (wh)
其中F()是噪波函数。请注意,x,y必须是单个瓷砖内的坐标:x in[0,w],y in[0,h)。您可以使用类似tileX=x-Math.Floor(x/w)*w或fmod()的内容

如果性能是关键的,或者对于更高的维度,这可能不是一种方法,因为它需要对维度D进行2^D查找。对于我来说,它还产生了朝向瓷砖中心的较低值

摘自:

只需像在柏林中一样在倾斜后平铺噪波即可。在添加偏移量以从基角获取其他角点之后(而不是之前),可以通过修改获得置换的部分来进行mod 256(或&255,无论您使用什么),这是HLSL中修改后的代码位:

uint3 iIdx0 = p0SI % 256;
uint3 iIdx1 = (p0SI + pI1) % 256;
uint3 iIdx2 = (p0SI + pI2) % 256;
uint3 iIdx3 = (p0SI + 1.0f) % 256;
uint iGI0 = gPerm[ iIdx0.x + gPerm[ iIdx0.y + gPerm[ iIdx0.z ] ] ] % 12;
uint iGI1 = gPerm[ iIdx1.x + gPerm[ iIdx1.y + gPerm[ iIdx1.z ] ] ] % 12;
uint iGI2 = gPerm[ iIdx2.x + gPerm[ iIdx2.y + gPerm[ iIdx2.z ] ] ] % 12;
uint iGI3 = gPerm[ iIdx3.x + gPerm[ iIdx3.y + gPerm[ iIdx3.z ] ] ] % 12;
p0SI是角点0,pI2和pI2是角点1和角点2的向量,以通常的方式计算。注意,在HLSL中,标量在混合运算中自动升级为向量,因此,例如1.0f实际上是(1.0,1.0,1.0).我刚刚想出了这个拼图,但效果明显。如果你需要给一个大星球或一些狗屎遮荫,但你的卡上只有一个精度,还有几个步骤。打电话给我


编辑:你知道,在仔细考虑之后,我认为你不需要改变任何东西。我认为它自动平铺在256个单位,实现时。

即使几年过去了,这个问题仍然是谷歌上最好的结果之一

在单纯形噪波中,直线(或正态)栅格的x和y倾斜,以找到点所在的单纯形(2D中的三角形),因此使用常用的平铺技术(%255或其他),它确实平铺,但在倾斜坐标上平铺,即“对角”平铺,这是非常无用的

我发现一个简单的解决方案是“取消扭曲”结果,这样原始X和Y首先“向左”扭曲,然后算法将“向右”扭曲,最终结果将重新对齐到非扭曲网格

例如,如果您的simplex实现类似于SimplexNoise.java,您可以在网络上的任何地方找到它,它会使用以下方法倾斜网格:

var F2 = 0.5*(Math.sqrt(3.0)-1.0);
var s = (xin+yin)*F2; // Hairy factor for 2D
var i = Math.floor(xin+s);
var j = Math.floor(yin+s);
您可以简单地在方法的入口点以相反方向“预倾斜”它:

var G2 = (3.0-Math.sqrt(3.0))/6.0;
var t = (xin+yin)*G2;
xin-=t;
yin-=t;
不幸的是,它产生了一种奇怪的效果(也就是说,它看起来有点歪斜:D),这通常不是问题,但取决于你需要这种噪声做什么


因为这对我来说是个问题,所以我尝试将这种“反向倾斜”仅应用于几个八度音阶,这些八度音阶在最终输出中更重,而使用插值来表示“更轻”八度音阶。该解决方案基于单纯形柏林噪声为我提供了令人满意的平铺效果,因为所有八度音阶上的插值会在平铺边界上产生太多衰减,并且当添加更多的八度音阶而不进行人工倾斜时,条纹效果会被额外的噪声掩盖。

这个问题似乎是合理的y已解决,详细描述了工作解决方案背后的想法。这是一个长期存在的问题的奇妙答案!

这是平铺柏林噪声,但不是单纯形噪声。该链接讨论了柏林噪声,但没有明确说明该方法仅适用于它。我有一个平铺单纯形噪声的工作2D实现,但选择了一个另一种选择是因为振幅朝瓷砖中心方向减小。Gabor噪声似乎可以产生良好的效果,并且瓷砖不必采用这种方法()。我很久以前也有过同样的问题。这个链接可能会对你有所帮助。感谢这个链接;不幸的是,文章结尾的结论是,这些实现只有平铺柏林噪声,而不是单纯形噪声。我花了几天时间研究平铺单纯形噪声,结果发现它获得了专利(美国专利#6867776)!完全浪费我的时间。不要浪费你的时间,用“经典噪音”相反。柏林噪音不是专利吗?如果你不知道的话,为了以防万一,肯尼斯·柏林创造了单纯形噪音来取代他的旧柏林噪音,因为它更快,人工制品更少。虽然这里的答案也很有趣,但这是我在任何地方找到的最好答案。我只是坚持使用柏林噪音,因为它是平铺的uch更容易,但关键是倾斜变换。我相信适当的倾斜是可能的,但我还没有找到任何人能够做到这一点。不过,高维噪声没有相同的特性。