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

Performance OpenGL-如何计算地形高度网格中的法线?,performance,opengl,grid,terrain,normals,Performance,Opengl,Grid,Terrain,Normals,我的方法是分别计算平行于X轴和Y轴的两个切向量。然后计算叉积,找到法向量 切线向量由穿过两个最近线段中点的直线给出,如下图所示 我想知道是否有一种更直接的计算方法,或者在CPU周期方面更便宜。实际上,你可以使用“有限差分法”(或者至少我认为它是以这种方式调用的)来计算它,而无需交叉积 实际上,它足够快,我用它来计算顶点着色器中动态的法线 // # P.xy store the position for which we want to calculate the normals //

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

切线向量由穿过两个最近线段中点的直线给出,如下图所示


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

实际上,你可以使用“有限差分法”(或者至少我认为它是以这种方式调用的)来计算它,而无需交叉积

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

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

我能问一下你用什么画这张图吗?这真的很好。可惜我不能给你超过+1:我用你的简单算法加倍了我的FPS!有什么数学解释吗?这里有一个更昂贵但更精确的版本,好的,有意义,N.z必须是偏移量的2倍,所以在我的例子中,我使用.03作为偏移量,给出N.z=.06考虑你的曲面:z=h(x,y),其中h是高度贴图。所以,z-h(x,y)=0这是一个方程,是g=0处的轮廓,对于以下函数:g(x,y,z)=z-f(x,y)g点在最大增加方向上的梯度。它也与轮廓平面正交。所以这是正常的。要找到离散梯度,以(x,y)为中心,取其相邻梯度的差值。grad_x=f(x+1,y)-f(x-1,y)/2 grad_y=f(x,y+1)-f(x,y-1)/2 grad_z=(z+1)-(z-1)/2=2/2=1整个事物可以在不改变方向的情况下缩放,所以乘以2。然后正常化。塔达!