c++ - 平铺单纯形噪声?

标签 c++ c algorithm textures procedural

我(作为爱好者)一直对伪随机噪声生成很感兴趣,特别是 Perlin 和 Simplex 算法。 Simplex 的优势在于速度(尤其是在较高维度时),但 Perlin 可以相对容易地平铺。我想知道是否有人知道平铺单纯形算法?固定维度可以,泛型更好;伪代码可以,c/c++更好。

最佳答案

只需像在 Perlin 中仅在倾斜后进行的方式一样平铺噪声。您可以通过修改获取排列的部分来执行此操作,以便在添加到偏移量之后(而不是之前)执行 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 的 vector 。请注意,在 HLSL 中,标量会在混合运算符中自动提升为 vector ,因此例如 1.0f 实际上是 (1.0,1.0,1.0)。我只是想出了这个平铺的东西,但显然它有效。如果你需要遮蔽一个大行星或一些狗屎,但你的卡上只有单一精度,还有几个步骤。打我。

编辑:您再考虑一下就知道了,我认为您不必更改任何内容。我认为它在实现时自动以 256 个单位平铺。

关于c++ - 平铺单纯形噪声?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1313259/

相关文章:

C++ STL 优先级队列插入 bad_alloc 异常

凯撒密码算法移位 C

php - 是否存在将 Unicode 文本大写的可靠方法?

algorithm - 如何制作这种模式发现算法?

c++ - 我如何构建我的 C++ 代码,以便我只编写一次常用方法?

c++ - 整数 vector

c# - 如何在对话框打开时禁用拖放

c++ - 将 float 转换为负数或正数

c - 使用 gcc -v 手动编译

c - MicroChip dsPic33,UART RX 中断未被调用