Skip to content

Instantly share code, notes, and snippets.

@koji
Last active July 19, 2025 19:00
Show Gist options
  • Save koji/f04fd3dc63a405c9425cbbd15ae4b4d1 to your computer and use it in GitHub Desktop.
Save koji/f04fd3dc63a405c9425cbbd15ae4b4d1 to your computer and use it in GitHub Desktop.
GLSL functions
// 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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment