// 2Dの擬似乱数(ハッシュ)を生成する関数
float hash21(vec2 p) {
p = fract(p * vec2(123.34, 456.21));
p += dot(p, p + 45.32);
return fract(p.x * p.y);
}
// 2D Value Noise
float noise(vec2 p) {
vec2 i = floor(p); // 整数部(格子のインデックス)
vec2 f = fract(p); // 小数部(格子内の位置)
// 格子内の位置を滑らかに補間
vec2 u = f * f * (3.0 - 2.0 * f);
// 4つの格子点のハッシュ値を取得
float a = hash21(i + vec2(0.0, 0.0));
float b = hash21(i + vec2(1.0, 0.0));
float c = hash21(i + vec2(0.0, 1.0));
float d = hash21(i + vec2(1.0, 1.0));
// 線形補間
return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
}
// 3Dの擬似乱数(ハッシュ)を生成する関数
float hash31(vec3 p) {
p = fract(p * 0.1031);
p += dot(p, p.yzx + 19.19);
return fract((p.x + p.y) * p.z);
}
// 3D Value Noise
float noise(vec3 p) {
vec3 i = floor(p);
vec3 f = fract(p);
// 格子内の位置を滑らかに補間
vec3 u = f * f * (3.0 - 2.0 * f);
// 8つの格子点のハッシュ値を取得し、線形補間
return mix(mix(mix(hash31(i + vec3(0,0,0)), hash31(i + vec3(1,0,0)), u.x),
mix(hash31(i + vec3(0,1,0)), hash31(i + vec3(1,1,0)), u.x), u.y),
mix(mix(hash31(i + vec3(0,0,1)), hash31(i + vec3(1,0,1)), u.x),
mix(hash31(i + vec3(0,1,1)), hash31(i + vec3(1,1,1)), u.x), u.y), u.z);
}
// fbm (Fractal Brownian Motion) - ノイズを重ねて複雑な模様を作る
// vec3版 (vec2でも同様に作成可能)
float fbm(vec3 p) {
float value = 0.0;
float amplitude = 0.5;
float frequency = 0.0;
for (int i = 0; i < 6; i++) { // 6オクターブ重ねる
value += amplitude * noise(p);
p *= 2.0;
amplitude *= 0.5;
}
return value;
}
Last active
July 19, 2025 19:00
-
-
Save koji/f04fd3dc63a405c9425cbbd15ae4b4d1 to your computer and use it in GitHub Desktop.
GLSL functions
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment