【Unity Shader入门】Shader基础概念:渲染流水线
【Unity Shader入门】Shader编程基础:ShaderLab语法
【Unity Shader入门】Shader数学基础:向量(矢量)
【Unity Shader入门】Shader数学基础:矩阵
【Unity Shader入门】Shader数学基础:矩阵变换
【Unity Shader入门】Shader编程初级:Shader结构
Shader数学基础:向量(矢量)
前言
笛卡尔座标系
二维笛卡尔座标系
一个二维的笛卡尔座标系包含了两个部分的信息:
一个特殊的位置,即原点,它是整个座标系的中心。
两条过原点的互相垂直的矢量,即X轴和Y轴。这些座标轴也被称为是该座标的矢量。
OpenGL 和 DirectX 使用了不同的二维笛卡尔座标系。OpenGL也就是Unity默认的座标系是以左下角为原点,DirectX是以左上角为原点。如下图:
三维笛卡尔座标系
在三维笛卡尔座标系中,我们需要定义三个座标轴和一个原点
3个座标轴被称为该座标系的基矢量,3个座标轴互相垂直,长度为1,这样的基矢量被称为标准正交基,如果长度不为1,被称为正交基。当然,座标轴方向也不是固定的,涉及到z轴向里为正还是向外为正,也就有了大家熟知的左手座标系和右手座标系。
三维笛卡尔座标系分为2种不同的座标系:左手座标系(left-handed coordinate space)和右手座标系(right-handed coordinate space)。
Unity使用的是左手座标系。但对于观察空间来说,Unity使用的是右手座标系。观察空间,通俗来讲就是以摄像机为原点的座标系。在这个座标系中,摄像机的前向是z轴的负方向,这与在模型空间和世界空间中的定义相反。也就是说,z轴座标的减少意味着场景深度的增加。
点和向量
介绍
点(point):是n维空间(游戏中主要使用二维和三维空间)中的一个位置,它没有大小、宽度这类概念。
向量(vector,也被称为矢量):是指n维空间中一种包含了模(magnitude)和方向(direction)的有向线段。速度(velocity)就是一种典型的向量。向量被用于表示相对于某个点的偏移,也就是说是一个相对量。
向量的模:指的是这个向量的长度。一个向量的长度可以是任意的非负数。
向量的方向:则描述了这个向量在空间中指向。
向量通常由一个箭头表示
向量的头(head):是它的箭头所在的端点处。
向量的尾(tail):是另一个端点处。
只要向量的模和方向保持不变,无论在哪里,都是同一个向量。
标量(scalar):只有模没有方向。例如距离(distance)就是一种标量。
区别
向量可以用于表示相对于另一个点的位置,此时向量的尾是一个位置,那么向量的头就可以表示另一个位置了。如果我们把向量的尾固定在座标系原点,那么这个向量的表示就和点的表示重合了。尽管点和向量在数学表达式上都是一样的,但区分点和向量之间的不同是非常重要的。可以这样理解,任何一个点都可以表示成一个从原点位置出发的向量。
点:没有大小之分的空间中的位置
向量:有模和方向,但是没有位置的量,相对量(可以描述相对位置),如果向量的头尾都固定在座标系的原点,则这个向量就和点重合了。
向量运算
向量和标量的乘法和除法
把一个向量和一个标量相乘,意味着对向量进行一个大小为标量的缩放。
一个向量也可以被一个非零的标量除。这等同于和这个标量的倒数相乘。
注意:对于乘法来说,向量和标量的位置可以互换的。但对于除法,只能是向量被标量除,而不能是标量被向量除,这是没有意义的。当k<0时,向量的方向也会取反。
例如,如果想把一个向量放大两倍,就乘以2,。当标量小于0时,向量的方向也会相反。
向量的加法和减法
两个向量进行相加或相减,其结果是一个相同维度的新向量。需要注意的是,一个矢量不能和一个标量相加或相减。矢量的加减法遵守三角法则。
向量的模
向量的模是一个标量,是向量在空间中的长度。对于二维向量,其实就是使用了勾股定理,两个直角边的长度为向量的分量的绝对值,斜边的长度为向量的模。
单位向量
很多情况下,我们只关心向量的方向而不是模。比如光照模型中,往往需要知道法线方向和光源方向,这种情况下我们不关心向量有多长,这样就需要计算单位向量。单位向量指的是模为1的向量,也被称为被归一化的向量(normalized vector),而把非零向量转换为单位向量的过程被称为归一化。计算单位向量公式如下:
向量点积
点积有两种定义方式:代数方式和几何方式。通过在欧氏空间中引入笛卡尔座标系,向量之间的点积既可以由向量座标的代数运算得出,也可以通过引入两个向量的长度和角度等几何概念来求解。
代数方式
矢量的点积满足交换律:
点积具有一些很重要的性质,在Shader计算中,我们经常利用这些性质来帮助计算。
性质一:点积可以结合标量乘法,也就是说,对点积中其中一个矢量进行缩放的结果,相当于对最后的点积结果进行缩放,即:
性质二:点积可以结合矢量加法和减法,也就是说,点积的操作数可以是矢量相加或相减后的结果。即:
性质三:一个矢量和本身进行点积的结果,是该矢量的模的平方,这可以用来比较两个矢量的长度大小。
几何方式
两个矢量的点积可以表示为两个矢量的模相乘,再乘以他们之间夹角的余弦值。
利用余弦定理推导:
从这个公式可以看出两个向量的夹角对于点积结果的影响,小于90度为正,等于90度为0,大于90度为负。还可以用反余弦求出两个向量的夹角。
几何意义
点积的几何意义中一个重要的几意义是投影(projection),点积的符号可以让我们知道两个矢量的方向关系。
向量叉积
叉积在图形学中常用于计算垂直于一个三角面的向量,用于判断三角面片的朝向等。
三维向量叉积的计算规律。不同颜色的线表示了计算结果向量中对应颜色的分量的计算路径。
以红色为例,即结果向量的第一个分量,它是从第一个向量的y分量出发乘以第二个向量的z分量,再减去第一个向量的z分量和第二向量的y分量的乘积
向量的叉积满足反交换律:
向量的叉积不满足交换律,也不满足结合律:
叉积的几何意义:
两个向量叉积会得到一个同时垂直于这两个向量的新向量
我们知道两个方向互不平行的向量可以确定一个平面,所以叉积最常见的应用就是计算垂直于一个平面的向量,我们后面会在顶点法线,切线那里用到。