【问题标题】:How to Generate Seeded 2D White Noise如何生成种子 2D 白噪声
【发布时间】:2017-02-01 23:39:48
【问题描述】:

我正在尝试编写一个函数,以便f(x, y, seed) 返回一些介于 0.0 和 1.0 之间的浮点数。 xy 是两个浮点数,seed 是一个整数。结果应该看起来像一个随机数,但使用相同的参数将始终返回相同的结果。我打算用它来生成地形(使用 Perlin 噪声),但效果应该是可以从给定的种子创建白噪声(x 和 y 参数对应于图像中的位置)。

我已经研究过使用散列函数来实现这一点,但是我遇到的所有这些函数要么不接受浮点数,要么不产生统一的结果(因此 0.0 和 1.0 之间的每个数字都有同样的可能性),显示一个明显的模式,或者结果对于接近的坐标变化不大)

【问题讨论】:

  • 您有可用的网格尺寸吗?

标签: python random hash noise


【解决方案1】:

取决于您要实现的分布,但例如对于已知图像大小的均匀分布,您可以这样做:

width = 100

from random import random
def f(x, y, seed):
    rng = random(seed)
    rng.jumpahead(x * width + y)
    return rng.random()

或者,如果您有可用的像素序号索引而不是 x 和 y,则不需要网格大小:

from random import random
def f(n, seed):
    rng = random(seed)
    rng.jumpahead(n)
    return rng.random()

【讨论】:

  • 我正在尝试做无限程序地形,所以很遗憾我没有图像大小。但是,我正在寻找一个统一的分布,我可能能够适应这个。谢谢
【解决方案2】:

又看了几个小时,我发现了这个:https://groups.google.com/forum/#!msg/proceduralcontent/AuvxuA1xqmE/T8t88r2rfUcJ

特别是,我使用了亚当·斯密的答案:

def rot(x, b):
    return((x<<b) ^ (x >> (32 - b)))

def pcghash(x, y, seed):
    for l in range(0, 3):
        x = rot(x^0xcafebabe + y^0xfaceb00c + seed^0xba5eba11, 23)
        x = rot(x^0xdeadbeef + y^0x8badf00d + seed^0x5ca1ab1e, 5)
        x = rot(x^0xca11ab1e + y^0xfacefeed + seed^0xdeadc0de, 17)
    return(x^y^seed)

def noise(x, y, seed):
    return(float('0.' + str(pcghash(x, y, seed))[-10:]))

这需要坐标和种子,并返回一个均匀分布在 0.0 和 1.0 之间的数字(小数点后 10 位)。我对此并不完全满意,因为所有参数都必须是整数,有很多未使用的生成位,而且我确信 noise() 函数中的代码可以改进得更快,但是这个适合我的目的。

编辑:可以在 hash12() 函数中找到更好的方法 (https://www.shadertoy.com/view/4djSRW):

float hash12(vec2 p) {
    vec3 p3  = fract(vec3(p.xyx) * .1031);
    p3 += dot(p3, p3.yzx + 19.19);
    return fract((p3.x + p3.y) * p3
}

这是在 GLSL 中,但应该很容易用其他语言实现。此外,虽然这是一个 2 维到 1 维的散列函数,但其​​他的可以在链接的 Shadertoy 着色器上使用。

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 2020-08-26
    • 2018-10-07
    • 2018-11-12
    • 2013-06-30
    • 2020-08-30
    • 2011-12-20
    • 2014-02-08
    相关资源
    最近更新 更多