performance - OpenGL-¿Cómo calcular las normales en una cuadrícula de altura del terreno?
grid terrain (1)
Mi enfoque es calcular dos vectores tangentes paralelos a los ejes X e Y respectivamente. Luego calcula el producto cruzado para encontrar el vector normal.
El vector tangente viene dado por la línea que cruza el punto medio en los dos segmentos más cercanos, como se muestra en la siguiente imagen.
Me preguntaba si hay un cálculo más directo o menos costoso en términos de ciclos de CPU.
Realmente puede calcularlo sin un producto cruzado, usando el "método de diferencias finitas" (o al menos creo que se llama de esta manera).
En realidad, es lo suficientemente rápido como para usarlo para calcular las normales sobre la marcha en un sombreado de vértice.
// # 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);