Unity Shader入门教程(二):数学知识
发表于2018-06-05
Shader的各种运算原理离不开数学,是因为它是建立在虚拟世界上的数学模型,作为图形学中的一部分,大家就需要先掌握Shader所需要的基本的数学基础,比如:矢量、矩阵等等。下面就和大家介绍下数学基础的数学知识部分,帮助大家去了解消化这些内容。
一、笛卡尔坐标系
平时我们使用的是笛卡尔坐标系,记得高中时还学过极坐标系
左手坐标系:中指指向+Z,食指指向+Y,拇指指向+X(右方),旋转正方向为顺时针
右手坐标系:中指指向+Z,食指指向+Y,拇指指向+X(左方),旋转正方向为逆时针
在Unity中,除了观察空间(摄像机视野)使用的是右手坐标系以外,其它都是使用左手坐标系。
二、点和矢量(略)
三、矩阵
矩阵乘法:
rXn的矩阵A和一个nXc的矩阵B,它们相乘会得到一个rXc的矩阵 C =AB
简单图示:
c23 = a21*b13 + a22*b23
同理:c21 = a21*b11 + a22*b21
特殊矩阵:
方阵:矩阵的行数和列数相同
单位矩阵:对线元素全为1,其余为0
转置矩阵:
(特性 )
逆矩阵:并非全部矩阵都可逆,逆矩阵与原矩阵相乘(无论左右)得到单位矩阵
正交矩阵:前提为方阵,与自身的转置矩阵相乘(无论左右)得到单位矩阵
实际上,其转置矩阵与逆矩阵相等
矩阵变换:
线性变换
f(x) + f(y) = f(x+y) kf(x) = f(kx)
仿射变换:
合并线性变换和平移变换的变换类型。仿射变换可以使用一个4X4的矩阵来表示,为此我们需要把矢量扩展到四维空间下,这就是齐次坐标系。
尝试使用线性变换进行平移操作
尝试使用线性变换进行平移操作 令f(x) = x + (1,2,3) 若x=1,那么: f(x)+f(x) = (4,6,8) f(2x) = f(x+x) = (3,4,5) 不满足最后一条 kf(x) = f(kx) 可见:我么无法使用单纯的线性变换来进行平移操作,于是就有了放射变换
平移与缩放:
对于任意一点point = (x,y,z) —————> (x,y,z,1)
为了让其能够同时接受平移变换,所以将其转换到齐次坐标下,其w分量设为1,这样当用一个4X4的矩阵对一个点进行变换时,平移、旋转、缩放都会施加于该点
平移
缩放
对于任意一方向矢量Vector=(x,y,z)
由于单纯矢量只有长度与方向的概念,所以平移变换对于矢量来说没有实际意义。
即矢量被平移之后不会发生改变。
所以转换到齐次坐标系下,其w分量为0
平移
缩放
旋转
关于复合变换:
优先进行缩放,然后进行旋转,最后进行平移
四、坐标空间
模型空间
通常以模型的中心为原点,采用左手坐标系,比如玩Maya时,按住D键不放调整模型的中心点。
Unity中model.TransformPoint(v3)函数可以得到model的局部空间中的点v3在世界空间中的表示
世界空间
就是的游戏场景中的小宇宙
Unity中model.InverseTransformPoint(v3)可以得到世界空间中的点v3在模型model的局部空间中的表示
观察空间
也就是摄像机空间,采用右手坐标系
Unity中可以调用Camera.cameraToWorldMatrix以及Camera.worldToCameraMatrix等接口自行计算某模型在观察空间中的位置。
这里要注意一点:观察空间和屏幕空间是不同的!前者是三维空间,而后者是二维空间。观察空间到屏幕空间需要进行一个操作,那就是投影(Projection)。
剪裁空间
前面的观察空间是以摄像机为中心的,而剪裁空间则是摄像机的视锥体内部空间 将前者中的一点转换到剪裁空间中所用的变换矩阵叫做剪裁矩阵,也被熟悉的称为投影矩阵 视锥体又分透视投影和正交投影
屏幕空间
屏幕空间是一个二维空间,将剪裁空间中的顶点投影到屏幕空间,生成对应的2D坐标: 首先,进行标准齐次除法,也就是透视除法后,用齐次坐标系的w分量除以x、y、z分量
坐标空间以及变换的总结
五、法线变换
法线是经常需要我们特殊处理的一种方向矢量,比如次时代技术中的高光贴图(BumpMap),专门存储模型的表面法线信息。
切线由两点之间的差值得到,与法线垂直。
值得注意的是,如果变换矩阵是一个正交矩阵,那么其逆矩阵就等于自身的转置矩阵。
那么左乘这个变换矩阵的逆转置矩阵就等于它自身了。
另外补充一个特性,左乘一个矩阵的转置等于右乘该矩阵!
六、Unity Shader内置变量
内置矩阵
摄像机与屏幕参数
七、子空间坐标向父空间的转换
已知子坐标空间C的3个坐标轴在父坐标空间P下的表示为xc、yc、zc,以及其原点位置Oc
给定一个子坐标空间中的一点Ac = (a,b,c)将其转换到父坐标空间下Ap:
Mc->p 经推导表示为将xc、yc、zc、Oc按列排列组成齐次矩阵。
而对于矢量无需平移,只需要将xc、yc、zc按列排列组成矩阵。
八、法线变换推理补充
在三维空间中,一个平面的表述为:ax + by + cz + d = 0;
n = (a,b,c,d) p=(x,y,z,1) 则该平面在空间中的表示为:nTp = 0
其中n为该面的法向量
现在对p进行变换,p’ = Rp
对法向量的变换,n’ = Qn
假设表示方式从空间A变换到了空间B中
变换后,该面上的任何点应该仍满足 :(n’)Tp’ = 0
也就是
(Qn)T(Rp) = 0
nT(QTR)p = 0
因为前面有:nTp = 0
所以,当QTR = I时
nT(QTR)p = 0 成立
从而得到(R可逆的情况下)
Q = (R-1)T
九、View Space中摄像机前方的z为负值,故-z为正数