关于切线空间的一些事

很多关于切线空间的计算,都是为了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/

你可能感兴趣的:(关于切线空间的一些事)