以下摘录自《Unity 3D ShaderLab开发实战详解》,18.1。

如果要理解法线贴图的用法,就要知道Tangent Space,即切空间。什么是切空间?想象一下这样一个假设的情形:“2013年2月14日,上帝创造完世界之后,没错,他刚刚把世界造好,然后他让全世界70亿人民全体力争,昂首挺胸,双脚着地,头朝上,面朝南,报告一下此时太阳的方位。”我可以肯定地告诉各位读者,会有70亿个不同的答案。因为每个人都是以自己为原点,以从脚到脑袋指向天空的方向为z轴,以正前方为x轴,右手为y轴。所谓的切线空间就是一个法线Normal(从脚到头的方向)、Tangent切方向(双眼直视正前方)和Binormal(水平抬起你的右胳膊)这3个矢量构造了一个空间,然然后把这3个方向矢量,也就是当前像素位置的Tangent、Binormal、Normal表示为一个矩阵,那么就是一个和_World2Object类似的矩阵,乘以它就会得到某一个向量在当前位置切空间的表示,具体来说就是太阳对于当前这个人来说的角度。这个时候,如果你在当前位置挖个坑,这坑的Normal也就是从BumpMap读取到的Normal,此时你可以放心地用当前太阳方位来进行计算,不用担心有人提醒你太阳的角度不对。记住,以你自己为中心所观察到的世界就是切空间。

以下转载自知乎为什么要有切线空间(Tangent Space),它的作用是什么?

1 .什么是切线空间?

Tangent Space,其实一个坐标系,也就是原点+三个坐标轴决定的一个相对空间,我们只要搞清楚原点和三个坐标轴是什么就可以了。在Tangent Space中,坐标原点就是顶点的位置,其中z轴是该顶点本身的法线方向(N)。另外两个坐标轴就是和该点相切的两条切线。这样的切线本来有无数条,但模型一般会给定该顶点的一个tangent,这个tangent方向一般是使用和纹理坐标方向相同的那条tangent(T)。而另一个坐标轴的方向(B)就可以通过normal和tangent的叉乘得到。



通常我们所见的法线纹理还是基于原法线信息构建的坐标系来构建出来的。那种偏蓝色的法线纹理其实就是存储了在每个顶点各自的Tangent Space中,法线的扰动方向。也就是说,如果一个顶点的法线方向不变,那么在它的Tangent Space中,新的normal值就是z轴方向,也就是说值为(0, 0, 1)。但这并不是法线纹理中存储的最终值,因为一个向量每个维度的取值范围在(-1, 1),而纹理每个通道的值范围在(0, 1),因此我们需要做一个映射,即pixel = (normal + 1) / 2。这样,之前的法线值(0, 0, 1)实际上对应了法线纹理中RGB的值为(0.5, 0.5, 1),而这个颜色也就是法线纹理中那大片的蓝色。这些蓝色实际上说明顶点的大部分法线是和模型本身法线一样的,不需要改变。总结一下就是,法线纹理的RGB通道存储了在每个顶点各自的Tangent Space中的法线方向的映射值。

2.为什么要有切线空间

实际上,法线本身存储在哪个坐标系中都是可以的,例如存储在World Space、或者Object Space、或者Tangent Space中。但问题是,我们并不是单纯的想要得到法线,后续的光照计算才是我们的目的。不管使用哪个坐标系,都面临着一个选择,就是最后光照计算使用的坐标系究竟是哪个。对于Tangent-Space Normal Map,我们一般就是在Tangent Space里计算的,也就是说,我们需要把viewDir、lightDir在Vertex Shader中转换到Tangent Space中,然后在Fragment Shader对法线纹理采样后,直接进行光照计算。 Tangent-Space还有如下一些优点:自由度很高。Tangent-Space Normal Map记录的是相对法线信息,这意味着,即便把该纹理应用到一个完全不同的网格上,也可以得到一个合理的结果。可进行UV动画。比如,我们可以移动一个纹理的UV坐标来实现一个凹凸移动的效果,这种UV动画在水或者火山熔岩这种类型的物体会会用到。可以重用Normal Map。比如,一个砖块,我们可以仅使用一张Normal Map就可以用到所有的六个面上。可压缩。由于Tangent-Space Normal Map中法线的Z方向总是正方向的,因此我们可以仅存储XY方向,而推导得到Z方向。

作者:潘友成
链接:https://www.zhihu.com/question/23706933/answer/161968056
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转注:binormal=cross(normal, tangent) * tangent.w
切空间矩阵(从对象空间到切线空间)matrix=[tangent.xyz, binormal, normal]

Shader山下(二十八) 切空间相关推荐

  1. 2008R2Win7管理二十八Mail之基本使用

    2008R2Win7管理二十八Mail之基本使用 上篇我们已经安装好了exchange2010,呵呵本片简单介绍和看下ex2010的基本界面和使用 安装完成打开exchange控制台如图所示 汗,有试 ...

  2. 微信小程序把玩(二十八)image组件

    原文:微信小程序把玩(二十八)image组件 image组件也是一个程序不可缺少的,可以这样说一个app中image组件随处可以看到,一般 image有两种加载方式第一种是网络图片第二种是本地图片资源 ...

  3. Citrix 服务器虚拟化之二十八 XenApp6.5发布文档内容

    Citrix 服务器虚拟化之二十八  XenApp 6.5发布文档内容 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1)  服务器桌面:发布场中服务器的整个 ...

  4. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  5. (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例

    Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21 我要评论 这篇文章主要介绍了Android项 ...

  6. SAP UI5 初学者教程之二十八 - SAP UI5 应用的集成测试工具 OPA 介绍试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...

  7. FreeSql (二十八)事务

    FreeSql实现了四种数据库事务的使用方法,脏读等事务相关方法暂时未提供.主要原因系这些方法各大数据库.甚至引擎的事务级别五花八门较难统一. 事务用于处理数据的一致性,处于同一个事务中的操作是一个U ...

  8. 计算机英语翻译3000字,英语专四作文满分范文(二十八):计算机翻译

    英语专四作文满分范文(二十八):计算机翻译 2015年专四考试预计4月18日开考,考生们现在应该进入紧张的冲刺复习阶段,专四作文是很多同学感到头疼的,在这里新东方在线整理了英语专四作文满分范文供考生们 ...

  9. WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]

    WCF技术剖析之二十八:自己动手获取元数据[附源代码下载] 原文:WCF技术剖析之二十八:自己动手获取元数据[附源代码下载] 元数据的发布方式决定了元数据的获取行为,WCF服务元数据架构体系通过Ser ...

  10. 【零基础学Java】—笔记本USB接口案例(二十八)

    [零基础学Java]-笔记本USB接口案例(二十八) 一.笔记本电脑 笔记本电脑(laptop)通常具备使用USB设备的功能,在生产时,笔记本都预留了可以插入USB设备的USB接口,但具体什么是USB ...

最新文章

  1. ubuntu16.04 sudo apt-get update解决Hash sum错误
  2. 微博运营与微博营销最易犯的20种错误,你犯了吗?
  3. 数据库之字段数据类型
  4. 7-27 御膳房 (5 分)
  5. SQL Server 索引结构及其使用(一)
  6. Istio 网关中的 Gateway 和 VirtualService 配置深度解析
  7. JavaSE——面向对象高级(继承、final关键字、抽象类与接口、多态、Object类、内部类、包装类、可变参数)
  8. python用筛选法求解小于n的所有素数_用筛选法求解n以内的所有素数
  9. const int *p说明不能修改_随时随地学习C语言之6—const修饰的变量真的不能修改吗?...
  10. SAP License:SAP顾问心情随笔——点燃一支烟
  11. Comparator 比较器接口
  12. fedora15下GNOME3使用笔记
  13. linux系统数据库导出语句,数据库应用-SQL语句导入导出大全
  14. Matlab用巴特沃斯带通滤波器产生窄带高斯噪声并进行时域频域分析
  15. 帝国cms7.2自定义列表建立tag效果 代码 教程
  16. 数据中台全面分析总结
  17. 微信小程序开发案例分享-必背诗:从0到1,从前端到数据库
  18. 过程控制工程,离子膜烧碱一次盐水精制的膜过滤器压力控制
  19. 如何全面的理解APS自动排产系统?
  20. Instagram帐户几种不同类型的封号情况及解决方案

热门文章

  1. 原 RPCA以及LRR
  2. 解决FTP上传文件速度慢的问题
  3. python psi指标
  4. PyQt5基本组件使用
  5. ubuntu18.04安装xmind思维导图 + 创建软件的快捷方式
  6. genymotion 下载模拟器下n久特别慢无法下载进度为0教你用迅雷下载这些虚拟机多爽啊想暂停就暂停
  7. 电脑播放html5后死机,电脑打开暴风影音5会死机的解决方法|电脑打开暴风影音5会死机的原因...
  8. 完全免费最好的在线pdf转换成word转换器
  9. 软件产品化的一些见解
  10. 解析Steam教育的课程设计测评体系