高度图的法线不起作用
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 着色(也许是法线贴图?)。
调整后:
我正在尝试为我的高度贴图实现法线,但它们似乎不起作用。
看看这些:
请注意,图案沿着边缘出现。为什么? 顶点是共享的(索引),法线是顶点所属的所有三角形的顶点的平均值。
法线算法如下所示:
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 着色(也许是法线贴图?)。 调整后: