GLSL: вычисление нормалей после тесселяции

У меня проблемы с вычислением нормалей после тесселяции.

В настоящее время у меня есть код, который сэмплирует карту высот и вычисляет из нее нормаль:

float HEIGHT = 2048.0f;
float WIDTH =2048.0f;
float SCALE =displace_ratio;

vec2 uv =  tex_coord_FS_in.xy;
vec2 du = vec2(1/WIDTH, 0);
vec2 dv= vec2(0, 1/HEIGHT);
float dhdu = SCALE/(2/WIDTH) * (texture(height_tex, uv+du).r - texture(height_tex, uv-du).r);
float dhdv = SCALE/(2/HEIGHT) * (texture(height_tex, uv+dv).r - texture(height_tex, uv-dv).r);

N = normalize(N+T*dhdu+B*dhdv);

Но не выглядит хорошо с тесселяцией низкого уровня введите описание изображения здесь

Как я могу избавиться от этого?


person Jozef Culen    schedule 10.04.2015    source источник
comment
Можете ли вы перенести обычный расчет на стадию фрагмента? Мне нужно больше информации о том, что вы на самом деле делаете, чтобы дать более подробный ответ.   -  person Gigo    schedule 13.04.2015
comment
Я думаю, что мог бы, код выше вычисляет нормали для вершин в шейдере оценки тесселяции.   -  person Jozef Culen    schedule 13.04.2015


Ответы (1)


Единственный способ избавиться от этого — использовать карту нормалей в сочетании с вычисленными нормалями. Нормали, которые вы видите справа, верны. Они просто в низком разрешении, потому что вы их так тесселируете. Используйте карту нормалей и попиксельное освещение, чтобы выделить сложные детали.

Кроме того, следует учитывать топологию исходной сетки. Более равномерно расположенные полигоны приводят к более равномерному расположению мозаики.

Кроме того, вы можете захотеть сделать вместо:

float dhdu = SCALE/(2/WIDTH) * (texture(height_tex, uv+du).r - texture(height_tex, uv-du).r);
float dhdv = SCALE/(2/HEIGHT) * (texture(height_tex, uv+dv).r - texture(height_tex, uv-dv).r);

выберите еще несколько точек из карты высот и усредните их, чтобы получить более усредненную версию нормали в каждой точке.

person Dimo Markov    schedule 12.04.2015