高度图的法线不起作用

Normals of height map dont work

我正在尝试为我的高度贴图实现法线,但它们似乎不起作用。

看看这些:

请注意,图案沿着边缘出现。为什么? 顶点是共享的(索引),法线是顶点所属的所有三角形的顶点的平均值。

法线算法如下所示:

 float size=Size;
  int  WGidY=int(gl_WorkGroupID.y);
  int  WGidX=int(gl_WorkGroupID.x);

    vec4 tempVertices[3];
    tempVertices[0]=imageLoad(HeightMap, ivec2(WGidX, WGidY));
    tempVertices[1]=imageLoad(HeightMap, ivec2(WGidX, WGidY+1));
    tempVertices[2]=imageLoad(HeightMap, ivec2(WGidX+1, WGidY));
    vec4 LoadedNormal=imageLoad(NormalMap, ivec2(WGidX, WGidY));
    vec4 Normal=vec4(0.0f);
    Normal.xyz=cross((tempVertices[0].xyz-tempVertices[1].xyz),  (tempVertices[0].xyz-tempVertices[2].xyz));
    Normal.w=1; 
    imageStore(NormalMap, ivec2(WGidX,WGidY),          Normal+LoadedNormal);

No need to do averaging like that.您可以直接一步计算如下:

vec3 v[4] = {
    imageLoad(HeightMap, ivec2(WGidX-1, WGidY)).xyz,
    imageLoad(HeightMap, ivec2(WGidX+1, WGidY)).xyz,
    imageLoad(HeightMap, ivec2(WGidX, WGidY-1)).xyz,
    imageLoad(HeightMap, ivec2(WGidX, WGidY+1)).xyz,
};
vec3 Normal = normalize(cross(v[1] - v[0], v[3] - v[2]));
imageStore(NormalMap, ivec2(WGidX,WGidY), vec4(Normal, 1));

此外,您甚至不需要显式存储 HeightMap 网格。相反,您可以将相同的低分辨率四边形发送到 GPU,使用曲面细分着色器对其进行曲面细分,通过从 one-channel 纹理采样将高度图应用于生成的顶点,然后计算法线如上所示。

好的伙计们,我发现了一个问题。这是 "greedy triangulation" 的症状。三角形内的法线通过重心算法进行插值,但边缘进行线性插值以防止相邻三角形之间的颜色差异。再次感谢您,Paul Bourke: http://paulbourke.net/texture_colour/interpolation/

如果您没有足够的三角形,请不要使用 Phong 着色(也许是法线贴图?)。 调整后:

http://prntscr.com/dadrue

http://prntscr.com/dadtum

http://prntscr.com/dadugf