🔢 ガウシアンブラー

// カーネル(3×3)
const kernel = [
    [1, 2, 1],
    [2, 4, 2],
    [1, 2, 1]
];
const kernelSum = 16;

// ぼかし処理
for (let y = 1; y < h - 1; y++) {
    for (let x = 1; x < w - 1; x++) {
        let sum = 0;
        for (let ky = -1; ky <= 1; ky++) {
            for (let kx = -1; kx <= 1; kx++) {
                sum += gray[(y + ky) * w + (x + kx)] * kernel[ky + 1][kx + 1];
            }
        }
        blurred[y * w + x] = sum / kernelSum;
    }
}
処理の説明:

1. カーネル定義
3×3のカーネル。中心の重みが4、周囲が2と1。合計16。

2. 周囲のピクセルを加重平均
各ピクセルの周囲9個を、カーネルの重みで加重平均。

3. 結果を正規化
合計を16で割って、正規化。これでぼかし完了。

4. ノイズが減る
ガウシアンブラーで、細かいノイズが滑らかになる。 ノーマルマップがより自然な表現に。