四處尋找了幾個小時後,我碰到這個傳來: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()
函數中的代碼可以改進得更快,但這適合我目的。
編輯:一個多更好的人可以在這裏(https://www.shadertoy.com/view/4djSRW)在hash12()函數發現:
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,但應該很容易在其他語言中實現。此外,雖然這是一種二維到一維哈希函數,但其他人可以在Shadertoy着色器上鍊接。
您是否有可用的網格尺寸? –