shader 入门精要笔记(7)
shader的数学基础涉及计算机图形学,而计算机图形学之所以深奥难懂在于其在虚拟世界上建立的数学模型,例如光照模型(GGX ,BRDF,Lambert,Phong)而在shader制作中,我们需要经常使用的便是向量和矩阵,也便是线性代数。首先是复习笛卡尔坐标系,二维笛卡尔坐标系包含两部分信息:1.原点,坐标系的中心,2.两条过中心点互相垂直的矢量,x,y 轴。在屏幕映射下Opengl和DX中使用的两种不同的坐标系,Opengl使用的是xy均定义分别向右和向上延伸为正半轴的二维坐标系,DX则相反。在三维坐标系下,我们定义3个坐标轴和1个原点,这3个坐标轴被称为该坐标系的基矢量,若这3个坐标轴之间相互垂直,长度为1,称其为标准正交基,而坐标系互相垂直但长度不为1的坐标系下,这样的基矢量为正交基。我们可以理解正交为互相垂直的意思,由于指向不同,又分为左手坐标系和右手坐标系。左右手坐标系对于运算没有任何影响只是屏幕视觉的不同,Unity使用的是右手坐标系,以摄像机为原点,摄像机的前向是Z轴的负方向,这与模型空间和世界空间中的定义相反,Z轴减少意外场景深度的增加。
点与矢量
在坐标中,点没有大小,宽度的概念,可以使用实数来表示一个点的坐标,矢量(向量)是由模和方向的,矢量的模指的是该矢量的长度,一个矢量的长度可以是任意非负数,矢量的方向描述该矢量在空间的指向,矢量并没有确切位置,它只有模和方向两个属性,矢量的箭头尾部端点处指向另一个端点处便是其方向,通常矢量被表示于某点的偏移,它是一个相对量,只要矢量的模和方向不变,它在坐标的任何位置都不会发生改变。
点与矢量的区别显而易见,如果把矢量的尾固定在坐标系原点,这就表示这个矢量和点是重合的,矢量与标量的乘除法:KV = (KVx,KVy,KVz) v/k = (x,y,z)/k = 1/k (x,y,z) = (x/k,y/k,z/k),k != 0;如果想使这个矢量扩大则乘以一个大于1的标量,缩小则乘以一个大于零小于1的标量,要改变其方向则乘以一个负数。
矢量的加法和减法,其结果是一个相同维度的新矢量。
a + b = (Ax + Bx ,Ay + By , Az + Bz )
a- b = (Ax - Bx , Ay - By , Az - Bz)
注意:一个矢量不可以与一个标量相加减,三角形法则是两个首位相连的矢量相加减后等于一个矢量。也可以理解为偏移后的两段矢量和一段矢量相等。
矢量的模
|V| =(根号下) Vx² + Vy² + Vz²
单位矢量值模为1的矢量,也被称为被归一化的矢量,对任意给定的非零矢量把它转换成单位矢量的过程叫做归一化。
v(戴帽号) = v/|v| (v是非零向量)
零向量不可被归一化,零矢量各个分量均为0
矢量的点积,也被称为内积
a . b = (Ax , Ay , Az ) . (Bx,By,Bz) = AxBx + AyBy + AzBz
矢量的点积满足交换律 a.b = b.a
点积的几何意义是投影,投影的值有可能是负数,假如单位矢量A 和另一个长度不限的矢量B,我们希望得到B在平行于A的一条直线上的投影,我们可以使用点积A.B 来得到B在A方向上有符号的投影
投影结果的正负号与AB的方向有关,其方向相反(夹角大于90度)结果小于0,互相垂直(等于90度)为0,方向相同(夹角小于90度)结果大于0
点积有三个性质:
性质1 : 点积可结合标量相乘
性质2 : 对点积其中一个进行缩放等于对点积结果进行缩放
性质3 : 一个矢量与其本身进行点积结果,是该矢量模的平方
a . b = |a| . |b| cosθ
矢量的叉积
叉积与点积不同,矢量叉积的结果仍为矢量,不是标量。a x b = (Ax,Ay,Az) x (Bx,By,Bz) = (AyBz - AzBy, AxBz-AzBx, AxBy- AyBx)
注意: 叉积不满足交换律,但是满足反交换律,叉积的常见应用就是计算垂直于一个平面,三角形的矢量,还可以判断三角面的朝向。
矩阵
矩阵的定义:它是由mxn个标量组成的长方形数组,是网格结构,由行,列之分,以3 x 3 的矩阵为例: M11 M12 M13
【 M21 M22 M23 】
M31 M32 M33
Mij在矩阵M中I表示第几行,j表示第几列
矢量可以理解为n x1的的行矩阵或者1x n的列矩阵,n表示矢量的维度
矩阵运算:和标量相乘,以 3x 3的矩阵为例,kM = Mk = k [m11 m12 m13 ] [km11 km12 km13]
m21 m22 m23 = km21 km22 km23
m31 m32 m33 km31 km32 km33
矩阵和矩阵的乘法:一个r x n的矩阵A和一个 n x c的矩阵B相乘,它们的结果AB将会是一个 r x c 的矩阵,注意其行列关系,它们相乘的原则是第一个矩阵的列数必须和第二个矩阵的行数相同,否则不能相乘,假如A为 4 x 3的矩阵,B为 3 x 6的矩阵,那么AB的矩阵是 4 x 6 的矩阵。 n
Cij = ai1b1j +ai2b2j + .........ainbnj∑aikbkj
k =1
假如一个2x4的矩阵A和一个4x4的矩阵B相乘,其为4 x 4的矩阵,它的第一行第一列的数是A矩阵的第一行和B矩阵的第一列相乘的和 依次类推得出AB矩阵每行每列的数。
矩阵乘法的性质: 矩阵乘法并不满足交换律
通常情况下 AB != BA
矩阵乘法满足结合律
(AB)C = A(BC)
ABCDE = ((A(BC))D)E = (AB)(CD)E
特殊的矩阵:1.方块矩阵:是指行列相同的矩阵例子:3 x3 , 4x4 的矩阵,对角元素,如果一个矩阵除了对角其他的元素均为0则其为对角矩阵。
2.单位矩阵:用In表示特殊的对角矩阵,对角元素都为1且是方块矩阵,MI = IM = M 任何矩阵和其相乘结果都为原来的矩阵
3.转置矩阵:给定一个 r xc 的矩阵M 它的转置可以表示为M的T次方,理解其转置为把原来的行和列互换,M的T次方ij = Mji
性质1:矩阵转置的转置等于原矩阵
性质2:矩阵串联的转置等于反向串联各个矩阵的转置
(AB)的转置 = B的转置乘以A的转置
-1 -1 -1
4.逆矩阵:如果给定一个方阵M ,M 为其逆矩阵,M M = M M = I
如果一个矩阵有对应的逆矩阵,我们说这个矩阵是可逆的,非奇异的,若没有则为奇异的,不可逆的
性质1:逆矩阵的逆矩阵是其本身
性质2:单位矩阵的逆矩阵是它本身
性质3:转置矩阵的逆矩阵是逆矩阵的转置
性质4:矩阵串联相乘后的逆矩阵等于反向串联各个矩阵的逆矩阵 T T T -1
5.正交矩阵:如果一个矩阵M和它的转置矩阵的乘积是单位矩阵的话,我们可以说这个矩阵是正交的,反过来也是成立的,矩阵M是正交等价于:MM = M M = I , M = M
以3 X 3 的矩阵为例 T - C1 - | | |
M M = [- C2 - ] [ C1 C2 C3 ]
- C3 - | | |
C1C1 C1C2 C1C3
= [C2C1 C2C2 C2C3 ]
C3C1 C3C2 C3C3
1 0 0
=[0 1 0]
0 0 1
我们由此得出9个等式 : C1C1 = 1 C1C2 =0 C1C3 = 0 C2C1 = 0 C2C2 = 1 C2C3 =0 C3C1 =0 C3C2 = 0 C3C3 = 1
得出结论:矩阵的每一行即C1,C2,C3是单位矢量,因此只有这样它们与自己的点积才能是1
矩阵的每一行,即C1,C2,C3之间互相垂直只有这样它们的点积才能为
上诉两条结论对矩阵的每一行同样适用,因为如果M是正交矩阵的话,M的转置也会是正交矩阵,如果一个矩阵满足上面的条件那么它是一个正交矩阵。但是一个坐标空间需要指定一组矢量基,也就是坐标轴是互相垂直的,我们称其为一组正交基,但是他们的长度不一定为1,如果他们为1那它就是一组标准正交基,但是其不是标准正交基而是正交基来构建一个矩阵时,其矩阵可能不是一个正交矩阵。

浙公网安备 33010602011771号