版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/w450468524/article/details/51649703
学习法线贴图(normal mapping)的过程中,最关键的一个矩阵就是TBN矩阵,该矩阵用于将存储在纹理空间中的法向量转换到模型空间中(实际使用相反,为了减少计算量,是将光线从模型空间转换到了纹理空间,然后计算反射光线,因为光线条数远远少于法向量数目)。
下图展示法线贴图的含义,图中的蓝色部分为一块法线纹理,上面的黑色小木棒(纯手工绘图)是每个像素的rgb代表的法线向量。就像一块海绵上插了无数歪歪扭扭的针一样……这样当计算反射光线时,这些法向量模拟凹凸不平的表面,最后产生真实的感觉。


首先考虑向量空间中坐标表示的问题,给定一个三维坐标系的一组基,X⃗ ,Y⃗ ,Z⃗ X→,Y→,Z→,那么该坐标系中的任意向量A⃗ (a1,a2,a3)A→(a1,a2,a3)的坐标的含义为:
A⃗ =a1∗X⃗ +a2∗Y⃗ +a3∗Z⃗ 
A→=a1∗X→+a2∗Y→+a3∗Z→
,即A⃗ A→用基向量表示时各分量的值。如果再给定另外一个坐标系的一组基U⃗ ,V⃗ ,W⃗ U→,V→,W→,并且给出X⃗ ,Y⃗ ,Z⃗ X→,Y→,Z→向量在这个坐标系中的表示x⃗ ,y⃗ ,z⃗ x→,y→,z→,那么就可以很方便得到A⃗ A→向量在第二个坐标系中的表示,(a1,a2,a3)∗[x⃗ ,y⃗ ,z⃗ ]T(a1,a2,a3)∗[x→,y→,z→]T。因此,[x⃗ ,y⃗ ,z⃗ ]T[x→,y→,z→]T可以看作是这两个空间的转换矩阵。


如上图所示,假定△ABC△ABC纹理映射到模型中△abc△abc这块三角形上,纹理中存储的rgb分量代表该点处法线在纹理空间中的坐标,我们要将左边的纹理空间中的法向量转换到右边的模型空间中(这里先只讨论uv二维的坐标,第三维直接取模型空间的法向量即可),已知顶点的UV坐标,模型坐标以及法向量,根据上面的讨论,现在要求出U⃗ ,V⃗ U→,V→这两个向量基在模型空间中的坐标,即右边T⃗ ,B⃗ T→,B→的坐标。我们可以列出一个方程组:

然后解出T⃗ ,B⃗ T→,B→即可。加上第三维坐标时,一般会选择垂直于TB平面的法向量N⃗ N→,这个向量是已知的。最后再将T⃗ ,B⃗ ,N⃗ T→,B→,N→归一化,就得到了转换矩阵。

但是开头说过了,实际我们使用的变换是将光线从模型空间变换到纹理空间,因此要求的实际是逆过程的转换矩阵,好在TBN矩阵是正交阵,转置一下就得到了

normal mapping中TBN矩阵的思考相关推荐

  1. Opengl中的TBN矩阵的计算和使用

    TBN矩阵 T:切线向量 B:副切线向量 N:法线向量 法线向量不用我们计算,我们的主要任务是根据三角形的坐标计算出T和B向量. 公式推导 如图,E2向量与纹理坐标的差ΔU2.ΔV2构成一个三角形.Δ ...

  2. OpenGL.Shader:9-学习光照-法线贴图(计算TBN矩阵)

    OpenGL.Shader:9-学习光照-法线贴图(计算TBN矩阵) 这次文章学习法线贴图,法线贴图在游戏开发和GIS系统开发当中尤为广泛,其表现力特别的强,绘制的效果特别接近真实.更重要的一点就是, ...

  3. Learn OpenGL 笔记6.5 Normal Mapping(法线贴图)

    我们通过在这些平面三角形上包裹 2D 纹理来增强真实感,隐藏多边形只是很小的平面三角形的事实. 从照明技术的角度来看,确定对象形状的唯一方法是通过其垂直法向量. 这种使用每片段法线与每表面法线相比的技 ...

  4. 切线空间、法线贴图、TBN矩阵

    目录 1 法线贴图 1.1 为什么需要? 1.2 怎么做法线映射? 2 切线空间 2.1 为什么需要切线空间? 2.2 切线空间是什么? 2.3 TBN矩阵 2.4 TBN矩阵计算 3 光照计算是在` ...

  5. 3DShader之法线贴图(normal mapping)

    凹凸贴图(bump mapping)实现的技术有几种,normal mapping属于其中的一种,这里WALL的实现在物体坐标系空间中,其他都在物体的切线空间中实现,国际惯例,上图先: 由于时间关系我 ...

  6. [GLSL]法线贴图(Normal mapping)原理及实现

    前一段时间了解到一个技术叫法线贴图,感觉这是一个很有意思的东西,所以我尝试去实现了一下,虽然网上有很多资料了,但在这里还是记录一下我的实现过程. 演示程序已上传:https://download.cs ...

  7. 法线贴图、TBN矩阵

    法线纹理 下图是一张法线纹理: 每个纹素的RGB值实际上表示的是XYZ向量:颜色的分量取值范围为0到1,而向量的分量取值范围是-1到1:可以建立从纹素到法线的简单映射 normal = (2*colo ...

  8. 【Unity Shaders】法线纹理(Normal Mapping)的实现细节

    写在前面 写这篇的目的是为了总结我长期以来的混乱.虽然题目是"法线纹理的实现细节",但其实我想讲的是如何在shader中编程正确使用法线进行光照计算.这里面最让人头大的就是各种矩阵 ...

  9. MIT18.065 数据分析、信号处理和机器学习中的矩阵方法-学习笔记

    文章目录 MIT18.065 数据分析.信号处理和机器学习中的矩阵方法 Lecture 1 The Column Space of A Contains All Vectors Ax A=CR A=C ...

最新文章

  1. 2022-2028年中国新零售行业深度调研及投资前景预测报告(全卷)
  2. 使用C++实现的一个五子棋系统(基于Socket编程)
  3. 《Head First设计模式》 读书笔记16 其余的模式(二) 蝇量 解释器 中介者
  4. 官宣!多所高校,整体搬迁!
  5. 7-107 汉诺塔的非递归实现 (25 分)
  6. Redis:缓存问题之数据不一致(更新数据库时 主动更新)
  7. JqGrid3.6最终版本今天发布了
  8. resnet 50 网络分析
  9. ContOS 7 安装Jenkins
  10. 不可能解开的谜题   (程序员修炼之道,评注者序)
  11. PMP课程笔记:第8章 项目质量管理
  12. 棋牌游戏判断牌型算法---适合所有的棋牌游戏
  13. 移动端 H5 概念术语(一)
  14. 屏蔽鼠标右键,F1帮助和常用快捷键
  15. C语言获取键盘方向键的键值
  16. 【随手记】有趣的面试题 —三人三鬼过河
  17. 《悲情曹雪芹》——诗篇总结
  18. 基于uFUN开发板的心率计(二)动态阈值算法获取心率值
  19. 密码学-第一讲信息安全概论
  20. 腾讯云对象存储空间分片、断点续传功能的封装与使用

热门文章

  1. 马化腾五兄弟:难得的创业团队
  2. 2021-06-01 51蛋骗鸡(单片机开关k1闭合时,实现发光二极管D1~D4,D8~D5循环点亮,k2闭合时,实现D4~D1,D5~D8循环点亮)
  3. 入秋这么穿,没人比你更优雅
  4. vcpkg安装msys2
  5. 线性代数基础知识整理
  6. 2017.1.13【初中部 GDKOI】模拟赛B组 我要的幸福 题解
  7. 如何评价 GitHub 发布的文本编辑器 Atom?(知乎)
  8. mysql分隔符声明_MySQL中的分隔符
  9. Linux shell 脚本编写
  10. multi-view human pose estimation相关项目配置经验