Normais por vértice do ruído perli

Estou gerando terreno no sombreador de geometria Opengl e estou tendo problemas para calcular as normais de iluminação. Estou gerando o terreno dinamicamente cada quadro com uma função de ruído perlin implementada no sombreador de geometria. Por causa disso,Eu preciso de uma maneira eficiente de calcular valores normais por vértice com base na função de ruído (sem textura ou qualquer coisa). Eu sou capaz de usar o produto cruzado de 2 lados para obter normais de face, mas eles são gerados dinamicamente com a geometria, então não posso voltar e suavizar as normais de face para normais de vértice. Como posso obter valores normais de vértice em tempo real usando a função de ruído que gera a altura do meu terreno no plano y (portanto, a altura está entre 1 e -1). Acredito que tenho que experimentar a função de ruído 4 vezes para cada vértice, mas tentei algo como o seguinte e não funcionou ...

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;

A iluminação acima realmente gerada se movia como um ruído permanente! Então, algum conselho sobre como obter os normais por vértice corretamente?

questionAnswers(2)

yourAnswerToTheQuestion