OpenGL - как рассчитать нормали в сетке высот местности?

мой подход заключается в вычислении двух касательных векторов, параллельных оси X и Y соответственно. Затем вычислить векторное произведение, чтобы найти нормальный вектор.

касательный вектор задается линией, пересекающей среднюю точку на двух ближайших сегментах, как показано на следующем рисунке.

enter image description here

Мне было интересно, есть ли более прямой расчет или менее дорогой с точки зрения циклов процессора.

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);