要会写Shader,需要掌握一些基本的空间知识,比如空间坐标,矢量,线性代数等。下面介绍一些相关知识。
坐标系:
常见的坐标系分为二维坐标系和三维坐标系,二维坐标系比较容易理解,它就是我们初中就已经接触过的X-Y轴坐标系,相信大家都已经有所认识,不再赘述。三维坐标系比二维坐标系多了Z轴,也多了一些特性。三维坐标系可以分为左手笛卡尔坐标系和右手笛卡尔坐标系。之所以存在2种坐标系,是因为两种坐标系无论如何旋转都无法使轴向和另一种坐标系完全相同。
左手笛卡尔坐标系:
伸出左手,拇指的指向为X轴,食指指向为Y轴,中指指向为Z轴,这样便构成了左手笛卡尔坐标系。Unity使用的是左手笛卡尔坐标系。
右手笛卡尔坐标系:
伸出右手,拇指的指向为X轴,食指指向为Y轴,中指指向为Z轴,这样便构成了右手笛卡尔坐标系。我们观察一下左右手坐标系的异同点:①伸出的手不同,②手指的顺序相同都是拇指-食指-中指。
左手法则:
目的是确定旋转方向。左手法则应用于左手笛卡尔坐标系,左手变成一个点赞的手势,拇指指向和轴方向相同,那么其他手指的指向就是旋转的正方向。
右手法则:
右手法则应用于右手笛卡尔坐标系,原理同上。
OpenGL屏幕坐标:
左下角为原点。
DirectX屏幕坐标:
左上角为原点。
矢量:
既有大小又有方向的量。矢量虽然和点的结构一样,都可以用Vector3来表示,但它们的意义不同。矢量在很多时候强调它的方向性,比如法线方向。而点更多的是描述物体的位置。
1、矢量减法:c = a - b,得到的结果是b矢量的末尾指向a矢量的末尾;
2、矢量加法:c = a + b,调整b矢量的位置,将a矢量的末尾指向b矢量的头,得到从a矢量的头出发连接到b矢量的末尾的矢量;
3、矢量点积:a · b = |a||b|,它的几何意义是两个矢量之间的投影大小,也可以用于计算两个矢量之间夹角的大小;
4、矢量叉积:|a * b| =|a||b|sin ,它的几何意义是,得到垂直于a,b矢量所在平面的方向。
矩阵:
《线性代数》这门课程主要学习的内容就是矩阵,那么线性代数和矩阵有什么关系呢?这是因为数学家发现线性代数的很多运算可以用矩阵来表达。多个线性代数构成的函数块,提取他们的代数构成矩阵,通过矩阵运算可以简化代数运算过程(大概就是这个意思,我也没太弄懂。。。)。图形学利用矩阵的一些特性,和运算来表达图形的移动、旋转、缩放。矩阵形如:
行矩阵:矩阵分为行和列,水平方向为行,竖直方向为列,当行为1时,此矩阵为行矩阵,形如M13:
列矩阵:列数为1的矩阵成为列矩阵,形如M31: