OpenGL——理解切线空间

10 篇文章 1 订阅
建议先看原文:本文只是一些理解和思考与总结

法线贴图优点:
更灵活,细节更多
可以交由艺术家发挥
更快
法线贴图缺点:
额外内存显存消耗
细节只能是趋于平面的
会带来额外的开销(即使只有一个向上的法线,也要全部计算一遍,或增加Switch Shader的开销)

你不能保证三角形表面的法线方向,一定和法线贴图的法线方向(Z+)一致,这样的话,你就需要 在一个不同的坐标空间中进行光照,使得法线贴图可以正常计算。
(1)这个坐标空间里,法线贴图向量总是指向这个坐标空间的正z方向
(2)所有的光照向量都相对与这个正z方向进行变换。这样我们就能始终使用同样的法线贴图,不管朝向问题。
这个坐标空间叫做切线空间(tangent space)。

切线空间:
法线贴图中的法线向量在切线空间中,法线永远指着正z方向。
切线空间是位于三角形表面之上的空间。
使用一个特定的矩阵我们就能将本地/切线空间中的法线向量转成世界或视图坐标,使它们转向到最终的贴图表面的方向。

对切线空间的理解:
用UV坐标和顶点坐标,推导出Tangent 和Bitangent切线向量,加上法向量Normal形成TBN矩阵。
(1)可以用TBN矩阵将法线变换到模型或者世界空间。
(2)也可以将光源,观察向量等,在Vertex Shader里面变换到切线空间去计算光照,这样更省,可以不必再Fragment Shader里面进行更耗时的计算。
(3)TBN中的TB,可以用UV坐标和顶点坐标计算出来,而TBN中的N,则是指的是,顶点的法线。matrix(T,B,N)*n的这个n,才是从法线贴图中还原出来的,像素法线。
(4)TBN是正交的,则,正交矩阵的逆阵等于他的转置,这可以在Shader计算的时候节省下大量时间。
(5)由于公用顶点问题,法线N很可能不是与TB正交的,这时候需要一个gram_simt变换,将其正交化。虽然结果在数学上,是不完全正确的,但是从结果来看,是完全可以接受的。
(6)TBN数据只需要导入模型的时候计算一次就够了,不用每次都重新计算。

下面的流程图,更方便的理解,如何将法线贴图中的法线n,转换到世界空间去。


如图所示:

    E1,E2通过顶点数据计算

    deltaUV 通过纹理坐标计算

    N,来自于3D软件导出的定点法线向量

    通过公式可以计算出主切线T ,和副切线B

    通过公式 normal = normal * 2.0 -1.0 可以将颜色空间的0-1范围的法线,转换回正常的-1到1空间的法线

    然后通过TBN向量获得TBN矩阵,用TBN矩阵就能将法线贴图中获得的法线,变换到世界空间了。

    这个拗口的东西弄懂了,就能很畅快的求得TBN矩阵了,后面的利用TBN的逆矩阵将光照,视角向量变换到切线空间也就没什么难度了。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值