很多关于切线空间的计算,都是为了NormalMap服务的
因为在NormalMap,里面存储的颜色数据是在切线空间里面的,取出来的时候,要计算切线空间,把灯光的方向计算到切线空间中才能正确计算角度的大小
但是关于切线空间,不一定是直接用世界空间坐标的计算,可以是在ViewMatrix的坐标系做计算
vec3 P = vec3(modelView * vec4(vertexPosition, 1.0))
vec3 N = modelNormalMatrix * vertexNormal
vec2 UV = vec2(gl_FragCoord.x/screenSize.x, gl_FragCoord.y/screenSize.y)
mat3 TBN(N, P, UV)
{
vec3 dp1 = dFdx(P);
vec3 dp2 = dFdy(P);
vec2 dUV1 = vec2(1.0,0.0);
vec3 dUV2 = vec2(0.0,1.0);
//dUV1 = dFdx(UV);
//dUV2 = dFdy(UV);
vec3 dp2perp = cross(dp2,N);
vec3 dp1perp = cross(N,dp1);
vec3 T = dp2perp * dUV1.x + dp1perp * dUV2.x;
vec3 B = dp1perp * dUV1.y + dp1perp * dUV2.y;
float invmax = inversesqrt(max(dot(T,T),dot(B,B)));
return mat3(T*invmax,B*invmax, N);
}
用的时候,把取出来的NormalMap的normal直接乘上TBN,能得到ViewMatrix下的normal数据
相关参考链接:
http://www.cnblogs.com/cxrs/archive/2009/10/25/1589515.html
https://learnopengl-cn.readthedocs.io/zh/latest/05%20Advanced%20Lighting/04%20Normal%20Mapping/