🔢 ノーマルマップ生成

// 周囲のピクセルから高さを取得
float heightL = texture2D(photo, uv + vec2(-0.001, 0.0)).r;
float heightR = texture2D(photo, uv + vec2(0.001, 0.0)).r;
float heightD = texture2D(photo, uv + vec2(0.0, -0.001)).r;
float heightU = texture2D(photo, uv + vec2(0.0, 0.001)).r;

// 高さ差から法線を計算
vec3 normal = normalize(vec3(
    heightL - heightR,  // X方向の傾き
    heightD - heightU,  // Y方向の傾き
    1.0             // Z方向(上向き)
));

// ノーマルマップ強度を適用
normal.xy *= normalStrength;
処理の説明:

1. 周囲のピクセルをサンプリング
左右上下の4つのピクセルから明度(高さ)を取得。 0.001のオフセットで、わずかにずらした位置をサンプリング。

2. 勾配を計算
左右の高さ差でX方向の傾き、上下の高さ差でY方向の傾きを計算。

3. 法線ベクトル生成
(傾きX, 傾きY, 1.0)を正規化して、法線ベクトルを作成。 これで凹凸の向きが分かります。