私のアプローチは、軸XとYにそれぞれ平行な2つの接線ベクトルを計算することです。次に、外積を計算して法線ベクトルを見つけます。
接線ベクトルは、次の図に示すように、2つの最も近いセグメントの中間点を横切る線によって与えられます。
より直接的な計算があるのか、それともCPUサイクルの点でより安価なのか疑問に思いました。
「有限差分法」を使用することで、実際には外積なしで計算できます(または少なくともこのように呼ばれていると思います)。
実際には、頂点シェーダーでその場で法線を計算するために使用するのに十分な速度です。
// # P.xy store the position for which we want to calculate the normals
// # height() here is a function that return the height at a point in the terrain
// read neightbor heights using an arbitrary small offset
vec3 off = vec3(1.0, 1.0, 0.0);
float hL = height(P.xy - off.xz);
float hR = height(P.xy + off.xz);
float hD = height(P.xy - off.zy);
float hU = height(P.xy + off.zy);
// deduce terrain normal
N.x = hL - hR;
N.y = hD - hU;
N.z = 2.0;
N = normalize(N);