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

djp7away  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(160)

我的方法是分别计算平行于X轴和Y轴的两个切向量,然后计算叉积来求法向量。
切向量由穿过两个最近线段中点的直线给出,如下图所示。

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

eh57zj3b

eh57zj3b1#

你实际上可以不用叉积,通过使用“有限差分法”(或者至少我认为它是这样叫的)来计算。
实际上,它的速度足够快,我用它来计算顶点着色器中的法线。

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

相关问题