关于切线空间的一些事

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值