[Unity Shader] 切线空间的法线贴图
切线空间的法线贴图,可以这样理解:
#纹理坐标是从0到1,它的坐标是x向右,y向下
#顶点坐标是从-1到-1,坐标是x向右,y向上
1 由表面上某点的切线Tangent、副切线Bitangent、法线Normal形成一个新的坐标系,即切线空间。
2 其中与法线垂直的切线有很多,在Unity中或者是Cg中,规定纹理坐标的方向u和v作为切线和副切线的方向。
3 修改法线的方向,会让表面看起来有凹凸感。这时在切线空间中,调整后的法线看起来是对原法线的扰动。
4 其扰动后的在切线空间中的坐标(x, y, z),其中x是u方向上的偏移,y是v方向上的偏移,z则是法线方向上的偏移。
5 将其作为颜色存储在法线贴图中。由于归一化之后的法线坐标,各分量范围在[-1, 1]之间,而颜色范围在[0, 1]之间。对其做(x+1)/2的映射计算,使其值满足颜色范围。
6 由于是偏移量,因此当表面凹凸没有变化时,法线为原法线方向(x y z) = (0, 0, 1)。映射到颜色之后为(0.5, 0.5, 1.0)。这也是为什么法线贴图大部分是偏浅蓝色的原因。
7 由于偏移后的法线是归一化的,因此满足x2 + y2 + z2 = 1。知道x和y就可以求出z。因此如果texture的类型被设置为Normal Map,Unity使用DXT5nm压缩算法,对法线贴图进行了压缩。只存储x和y的值,存储在贴图中的a和g通道(即w和y),这样另外两个通道可对其他数据进行存储。见UnityCG.cginc的UnpackNormal函数
inline fixed3 UnpackNormalDXT5nm (fixed4 packednormal)
{
fixed3 normal;
normal.xy = packednormal.wy * - ;
normal.z = sqrt( - saturate(dot(normal.xy, normal.xy)));
return normal;
} inline fixed3 UnpackNormal(fixed4 packednormal)
{
#if defined(UNITY_NO_DXT5nm)
return packednormal.xyz * - ;
#else
return UnpackNormalDXT5nm(packednormal);
#endif
}
书中(《Unity Shader 入门精要》)P153页,求得了世界空间下的切线、副切线、法线后,归一化得到这三个正交分量。按列摆放可得到从切线空间到世界空间的变换矩阵。没有完全理解为什么按列摆放就是从切线空间到世界空间的变换矩阵。不知道下面的推导过程是否正确,先做个记录。
[Unity Shader] 切线空间的法线贴图的更多相关文章
- 【Unity Shader】六、使用法线贴图(Normal Map)的Shader
学习资料: http://www.sikiedu.com/course/37/task/456/show# http://www.sikiedu.com/course/37/task/458/show ...
- 【Unity Shader学习笔记】Unity基础纹理-法线贴图
1 高度纹理 使用一张纹理改变物体表面法线,为模型提供更多细节. 有两种主要方法: 1.高度映射:使用一张高度纹理(height map)来模拟表面位移(displacement).得到一个修改后的法 ...
- Unity shader学习之切线空间下计算凹凸映射
切线空间,即使用顶点的切线作为x轴,法线作为z轴,法线与切线的叉积作为y轴. 使用切线空间存储法线,使得法线纹理可以复用,很好. 在切线空间中计算光照,比在世界空间中计算光照少了很多计算量.在切线空间 ...
- 【Unity Shader】(四) ------ 纹理之法线纹理、单张纹理及遮罩纹理的实现
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) ----- ...
- 切线空间(Tangent Space)法线映射(Normal Mapping)【转】
// 请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 切线空间(Tangent Space) 切换空间,同局部空间.世界空间等一样,是3D图形学中众多的坐标系之一.切 ...
- Esfog_UnityShader教程_NormalMap法线贴图
咳咳,好久没有更新了,一来是这段时间很忙很忙,再来就是自己有些懒了,这个要不得啊,赶紧补上.在前面我们已经介绍过了漫反射和镜面反射,这两个是基本的光照类型,仅仅依靠它们就想制作出精美的效果是远远不够的 ...
- Unity Shader 知识点总结(二)
紧接着上一篇文章的shader入门知识的总结,本文主要总结shader中的纹理贴图.透明度混合.顶点动画.后期特效处理等操作.如果有什么地方有错,请指出更正,谢谢.本文的代码主要来自开源书:unity ...
- Unity Shader入门精要学习笔记 - 第7章 基础纹理
转自 冯乐乐的 <Unity Shader 入门精要> 纹理最初的目的就是使用一张图片来控制模型的外观.使用纹理映射技术,我们可以把一张图“黏”在模型表面,逐纹素地控制模型的颜色. 在美术 ...
- Unity Shader 入门精要学习 (冯乐乐 著)
第1篇 基础篇 第1章 欢迎来到Shader的世界 第2章 渲染流水线 第3章 Unity Shader 基础 第4章 学习Shader所需的数学基础 第2篇 初级篇 第5章 开始Unity Shad ...
随机推荐
- spark搭建部署
基础环境准备 安装JDK1.8+,并设置环境变量 搭建zookeeper集群 搭建Hadoop集群 Spark local模式 上传编译完成的spark安装程序到服务器上,并解压到指定目录 [root ...
- HTML、jsp页面中radio,checkbox,select数据回显功能,默认被选中问题
最近常常遇到各种复选框.单选框.下拉框的默认被选中的问题,开始也是绞尽脑汁的想办法,今天写一篇学习总结的博文来写一下学习总结. 单选框(radio)默认被选中: 一.jstl技术进行回显 <in ...
- oc消息转发:forwardInvocation、签名、参量个数、SEL 相关测试
结论1.签名的参量类型伪造不正确会导致崩溃. 结论二.签名个数不对可能会导致参量丢失. 结论三:在签名配置正确的情况下,系统会将函数调用的所有信息打包到NSInvocation准备转发: - (voi ...
- 1070. [SCOI2007]修车【费用流】
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序, ...
- virtualbox迁移已建虚机存储磁盘方法
1. 先关闭虚拟机 2. 将虚拟机的磁盘拷贝或移动到想要存储的位置,virtualbox一般为.vdi文件(虚拟磁盘文件) 3. vboxmanage internalcommands sethduu ...
- Ubuntu14.04更换阿里云源
步骤很简单一共三步,如下所示: 第一.备份源文件(防止万一) sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 第二.修改源文件(这里的源 ...
- Linux服务器之间免密同步文件、重启R服务
机器:ML-01/ML-02/ML-03 需求: 1.在ML-01上自动将文件同步至ML-02/ML-03 2.在ML-01上通过脚本重启ML-02/ML-03上的R服务 说明:以下示例中,ML-02 ...
- 常用命令 tcl & shell
TCL 常用命令: 1. 当前时间 [exec date +%m%d_%H%M] (实际是调用shell命令 date),比如在 icc 中保存cell 时可以用:save_mw_cel ...
- NYOJ 44 字串和 (最大字串和 线性dp)
题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=44 子串和 时间限制:5000 ms | 内存限制:65535 KB 难度:3 ...
- iOS10--消息通知的基本使用
官方将通知单独放在了UserNotifications.framework,使用时需要导入框架.UserNotifications.framework主要类文件: UNCalendarNotifica ...