OpenGL - 如何计算地形高度网格中的法线?

时间:2012-12-21 01:44:20

标签: performance opengl grid terrain normals

我的方法是分别计算平行于轴X和Y的两个切向量。然后计算叉积以找到法向量。

切线向量由两条最近段上的中点交叉的线给出,如下图所示。

enter image description here

我想知道是否有更直接的计算,或者在CPU周期方面更便宜。

1 个答案:

答案 0 :(得分:51)

你可以通过使用“有限差分法”(或至少我认为以这种方式调用它)来实际计算它而不使用叉积。

实际上它足够快,我用它在顶点着色器中动态计算法线。

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