Ответ 1
Вы можете рассчитать его без перекрестного произведения, используя "метод конечных разностей" (или, по крайней мере, я думаю, что он вызывается таким образом).
На самом деле это достаточно быстро, что я использую его для вычисления нормалей "на лету" в вершинном шейдере.
// # 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);