GLSL:在镶嵌后计算法线

时间:2015-04-10 20:31:42

标签: opengl glsl normals tesselation

我在测试后计算法线有问题。

目前我有一些代码可以对高度图进行采样并从中计算法线:

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

但是低级别的细分enter image description here

看起来不太好

我怎样摆脱这个?

1 个答案:

答案 0 :(得分: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);

从高度图中再抽取几个点,并对它们求平均值,以便在每个点提取更平均的法线版本。