Подтвердить что ты не робот

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

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

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

enter image description here

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

4b9b3361

Ответ 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);