¿Normal por vértice por ruido perlin?

Estoy generando terreno en el sombreador de geometría Opengl y tengo problemas para calcular las normales para la iluminación. Estoy generando el terreno dinámicamente cada cuadro con una función de ruido perlin implementada en el sombreador de geometría. Debido a esto, Necesito una forma eficiente de calcular las normales por vértice basado en la función de ruido (sin textura ni nada). Puedo tomar el producto cruzado de 2 lados para obtener las normales de la cara, pero se generan dinámicamente con la geometría, por lo que no puedo volver y suavizar las normales de la cara para las normales de vértice. ¿Cómo puedo obtener normales de vértice sobre la marcha simplemente usando la función de ruido que genera la altura de mi terreno en el plano y (por lo tanto, la altura está entre 1 y -1)? Creo que tengo que probar la función de ruido 4 veces para cada vértice, pero intenté algo como lo siguiente y no funcionó ...

vec3 xP1 = vertex + vec3(1.0, 0.0, 0.0);
vec3 xN1 = vertex + vec3(-1.0, 0.0, 0.0);
vec3 zP1 = vertex + vec3(0.0, 0.0, 1.0);
vec3 zN1 = vertex + vec3(0.0, 0.0, -1.0);

float sx = snoise(xP1) - snoise(xN1);
float sz = snoise(zP1) - snoise(zN1);

vec3 n = vec3(-sx, 1.0, sz);
normalize(n);

return n;

¡Lo anterior en realidad generó una iluminación que se movía como un ruido de perlin! Entonces, ¿algún consejo sobre cómo puedo obtener las normales por vértice correctamente?

Respuestas a la pregunta(2)

Su respuesta a la pregunta