1

我在细分后计算法线时遇到问题。

目前我有代码可以对高度图进行采样并从中计算正常值:

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

但是对于低级别的镶嵌看起来不太好在此处输入图像描述

我怎样才能摆脱这个?

4

1 回答 1

0

摆脱这种情况的唯一方法是将法线贴图与计算的法线结合使用。您在右侧看到的法线是正确的。它们只是分辨率低,因为你对它们进行了细分。使用法线贴图和逐像素照明来突出复杂的细节。

此外,要考虑的一件事是初始网格的拓扑。更均匀间隔的多边形会导致更均匀间隔的镶嵌。

此外,您可能想要这样做,而不是:

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

从高度图中再采样几个点,并对它们进行平均以在每个点处提取更平均的法线版本。

于 2015-04-12T12:01:34.500 回答