Unity Shader入门精要 第4章 Unity Shader 的内置变量(数学篇) 读书笔记
第4章 学习Shader所需的数学基础-Unity Shader 的内置变量(数学篇)
注意:图片的来源基本来自作者冯乐乐的GitHub,感谢作者分享
https://github.com/candycat1992/Unity_Shaders_Book
Unity 提供了内置参数,不再需要自己手动计算
Unity 内置的用于空间变换和摄像机以及屏幕参数的内置变量。在 UnityShaderVariables.cginc 文件中找到定义和说明
变换矩阵:
用于坐标空间变换。
UNITY_MATRIX_T_MV 矩阵:正交矩阵
对于正交矩阵来说,正交矩阵的 逆矩阵 是 转置矩阵
如果 UNITY_MATRIX_MV 是一个正交矩阵,那么 UNITY_MATRIX_T_MV 是它的 转置矩阵,也是他它的 逆矩阵,即 可以使用 UNITY_MATRIX_T_MV 把顶点和方向矢量 从 观察空间 变换到 模型空间。
判断 UNITY_MATRIX_MV 为正交矩阵:
1、如果只考虑 旋转、平移 和 缩放 三种变换的话,如果一个模型的变换 只是包括 旋转,那么 UNITY_MATRIX_MV 就是一个 正交矩阵。
2、如果只包括 旋转 和 统一缩放(假设缩放系数是k),那么 UNITY_MATRIX_MV 就很大可能是正交矩阵了,因为 统一缩放 可能会导致每一行(或者每一列)的矢量长度不为1,而是k,这个不符合正交矩阵的特性,但是可以通过除以统一缩放系数,把它变成正交矩阵。在这种情况下:
3、如果只包括 旋转 和 统一缩放(假设缩放系数是k),只是对方向矢量进行变换(方向矢量在使用前进行归一化处理消除统一缩放的影响),就不用考虑有没有平移变换(平移对方向矢量没有影响),可以截取 UNITY_MATRIX_T_MV 的前三行前三列来把方向矢量 从 观察空间 变换到 模型空间
UNITY_MATRIX_IT_MV 矩阵:UNITY_MATRIX_MV 的 转置矩阵
法线的变换需要使用原变换矩阵的逆转置矩阵。
UNITY_MATRIX_IT_MV 可以把 法线 从 模型空间 变换到 观察空间
直接得到 UNITY_MATRIX_MV 的逆矩阵:对 UNITY_MATRIX_IT_MV 进行转置
把 顶点 或 方向矢量 从 观察空间 变换到 模型空间:
//方法一:使用 transpose 函数 对 UNITY_MATRIX_IT_MV 进行转置
//得到 UNITY_MATRIX_MV 的逆矩阵,然后进行 列矩阵 乘法,
//把观察空间中的点或方向矢量变换到模型空间中
float4 modelPos = mul ( transpose ( UNITY_MATRIX_IT_MV ) , viewPos;
//方法二:不直接使用转置函数 transpose,而是交换 mul 参数的位置,使用行矩阵乘法
//本质和方法一是一样的
float4 modelPos = mul(viewPos , UNITY_MARTIX_IT_MV );
摄像机和屏幕参数:
Unity内置变量访问当前正在渲染的摄像机的参数信息(参数对应了摄像机上的 Camera 组件的属性值):