unity shader:数学基础
2017-09-01 11:43
609 查看
简介:数学在shader中应用比较广泛,如:向量,矩阵等,了解基本的数学知识对shader的编写是有比较大的帮助的。
坐标系:我们常用的坐标系是笛卡尔坐标系,分为二维和三维两种。
其中二维坐标系我们可以通过旋转来实现坐标重合,但是三维坐标系中无论怎么变化,总有一个坐标是反方向的,并且三维坐标系又分为左手坐标系和右手坐标系两种,分别如下:
1.左手坐标系:就是左手大拇指朝右,食指朝上,中指朝前构成的坐标系。
2.左手守则:就是左手大拇指朝着旋转轴方向,其他四指弯曲方向就是旋转方向,此时旋转方向是顺时针的。
3.右手坐标系:就是右手大拇指朝左,食指朝上,中指朝前构成的坐标系。
4.右手法则:就是右手大拇指朝着旋转轴方向,其他四指弯曲方向就是旋转方向,此时旋转方向是逆时针的。
坐标空间:游戏中往往存在不同的坐标空间,这些坐标空间在特定的环境下可以更加清晰的描述物体的行为。unity中的坐标空间如下:
1.模型空间:也称对象空间或者局部空间,表示相对模型对象自己的空间,表示的是模型对象自己的方向,如上下左右前后等,用的是左手坐标系。
2.世界空间:就是游戏世界中的最大空间,表示的绝对坐标,在游戏世界里没有父空间,用的也是左手坐标系。
3.观察空间:就是摄像机空间,也是一种特殊的模型空间,空间坐标轴中z轴指向模型空间中z轴相反方向,所以用的是右手坐标系。
4.裁剪空间:按照视锥体的六个平面进行裁剪工作,将不在平面内的位置进行剔除,将在视锥体内的位置转换到齐次坐标空间中,用的是左手坐标系。
5.屏幕空间:就是像素二维空间,将位置最终转换成像素,用的是左手坐标系。
注意:模型空间中的点经过一些列空间变化,如:模型空间坐标转换成世界空间坐标,然后转换成观察空间坐标,再转换成裁剪空间坐标,最终映射到屏幕坐标空间中。
向量的使用:
1.向量的点积就是向量每一个分量的乘积之和得到的结果,并且等于向量长度乘积乘以向量之间的余弦值,公式如下:
所以,当点积大于0时,此时向量之间的角度小于90度,当点积等于0时,向量之间角度等于90度,当点积结果小于0时,向量之间角度大于90度。
2.向量的叉乘就是当前向量的分量其他位置分量值和被叉乘向量对应位置的分量值相乘取差值得到的一个向量,公式如下:
所以,得到的这个向量V垂直于进行叉乘操作的两个向量V1,V2所在的平面时,那么就称这个得到的向量V为法向量。并且如果法向量朝向我们,则说明我们可以看见法向量垂直的平面,否则说明,法向量垂直于平面的背部,这个背部平面被GPU进行剔除,我们就看不见法线垂直的平面了,这个过程又称之为背面剔除。
矩阵的使用:
1.逆矩阵的获取方法通常可以采用逆M和M乘积为单位矩阵的特性来获取,当然也可以使用初等变换求逆矩阵,所谓的初等变换就是将矩阵增加相同行列的单位矩阵,然后将原先行列的元素变成单位矩阵元素,最终添加进去的矩阵就是逆矩阵。
2.正交矩阵就是表示矩阵M和倒置M相乘后得到的是一个单位矩阵。由于矩阵M和M的逆矩阵乘积也是单位矩阵,所以且在正交矩阵中,倒置M和逆向M是等价的。
3.正交基就是基矢量之间互相垂直。而单位正交基就是基矢量为1的正交基。
4.矩阵的几何意义在于变换,常见的变换有旋转,缩放,平移等,分别如下:
旋转:
平移:
缩放:
子空间C到父空间P的变换矩阵:
其中x,y,z分别表示子空间C内x,y,z轴矢量,o表示子空间原点矢量
父空间P到子空间C的变换矩阵:就是将上面子空间到父空间变换矩阵求反就行了,如果子空间到父空间的变换矩阵时正交矩阵,根据正交矩阵的特效,可以取变换矩阵的倒置矩阵等价于逆矩阵,从而获取父空间到子空间的变换矩阵。
法线变换:法线和切线是垂直的,所以法线向量和切线向量的点积为0,要想获取法线向量的变换矩阵,可以使用切换的变换矩阵进行表示,最终发现的变换矩阵为:
其中M(a->b)表示切线的变换矩阵
透视投影:投影矩阵如下
其中判定经过该矩阵变换的位置满足-w <= x or y or z <= w时表示变换后位置不需要裁剪,就在裁剪空间内,否则就需要进行裁剪
正交投影:投影矩阵如下
其中判定经过该矩阵变换的位置满足-w <= x or y or z <= w时表示变换后位置不需要裁剪,就在裁剪空间内,否则就需要进行裁剪
透视除法:就是将观察空间转换到裁剪空间的位置分量x,y,z分别于w相除,从而将得到的坐标转移到立方体内。
屏幕空间位置计算公式:unity中已经自动帮我们进行了透视除法和坐标映射,最终获取一个二维屏幕坐标,我们只需要将观察空间坐标变换到裁剪空间坐标即可(也就是通过透视投影或者正交投影进行变换),剩下的工作交给unity自动完成。
坐标系:我们常用的坐标系是笛卡尔坐标系,分为二维和三维两种。
其中二维坐标系我们可以通过旋转来实现坐标重合,但是三维坐标系中无论怎么变化,总有一个坐标是反方向的,并且三维坐标系又分为左手坐标系和右手坐标系两种,分别如下:
1.左手坐标系:就是左手大拇指朝右,食指朝上,中指朝前构成的坐标系。
2.左手守则:就是左手大拇指朝着旋转轴方向,其他四指弯曲方向就是旋转方向,此时旋转方向是顺时针的。
3.右手坐标系:就是右手大拇指朝左,食指朝上,中指朝前构成的坐标系。
4.右手法则:就是右手大拇指朝着旋转轴方向,其他四指弯曲方向就是旋转方向,此时旋转方向是逆时针的。
坐标空间:游戏中往往存在不同的坐标空间,这些坐标空间在特定的环境下可以更加清晰的描述物体的行为。unity中的坐标空间如下:
1.模型空间:也称对象空间或者局部空间,表示相对模型对象自己的空间,表示的是模型对象自己的方向,如上下左右前后等,用的是左手坐标系。
2.世界空间:就是游戏世界中的最大空间,表示的绝对坐标,在游戏世界里没有父空间,用的也是左手坐标系。
3.观察空间:就是摄像机空间,也是一种特殊的模型空间,空间坐标轴中z轴指向模型空间中z轴相反方向,所以用的是右手坐标系。
4.裁剪空间:按照视锥体的六个平面进行裁剪工作,将不在平面内的位置进行剔除,将在视锥体内的位置转换到齐次坐标空间中,用的是左手坐标系。
5.屏幕空间:就是像素二维空间,将位置最终转换成像素,用的是左手坐标系。
注意:模型空间中的点经过一些列空间变化,如:模型空间坐标转换成世界空间坐标,然后转换成观察空间坐标,再转换成裁剪空间坐标,最终映射到屏幕坐标空间中。
向量的使用:
1.向量的点积就是向量每一个分量的乘积之和得到的结果,并且等于向量长度乘积乘以向量之间的余弦值,公式如下:
V1(x1, y1, z1) . V2(x2, y2, z2) = x1 * x2 + y1 * y2 + z1 * z2 = ||V1|| * ||V2|| * cos(a)
所以,当点积大于0时,此时向量之间的角度小于90度,当点积等于0时,向量之间角度等于90度,当点积结果小于0时,向量之间角度大于90度。
2.向量的叉乘就是当前向量的分量其他位置分量值和被叉乘向量对应位置的分量值相乘取差值得到的一个向量,公式如下:
V1(x1, y1, z1) X V2(x2, y2, z2) = V(y1 * y2 - z1 * z2, z1 * z2 - x1 * x2, x1 * x2 - y1 * y2)
所以,得到的这个向量V垂直于进行叉乘操作的两个向量V1,V2所在的平面时,那么就称这个得到的向量V为法向量。并且如果法向量朝向我们,则说明我们可以看见法向量垂直的平面,否则说明,法向量垂直于平面的背部,这个背部平面被GPU进行剔除,我们就看不见法线垂直的平面了,这个过程又称之为背面剔除。
矩阵的使用:
1.逆矩阵的获取方法通常可以采用逆M和M乘积为单位矩阵的特性来获取,当然也可以使用初等变换求逆矩阵,所谓的初等变换就是将矩阵增加相同行列的单位矩阵,然后将原先行列的元素变成单位矩阵元素,最终添加进去的矩阵就是逆矩阵。
2.正交矩阵就是表示矩阵M和倒置M相乘后得到的是一个单位矩阵。由于矩阵M和M的逆矩阵乘积也是单位矩阵,所以且在正交矩阵中,倒置M和逆向M是等价的。
3.正交基就是基矢量之间互相垂直。而单位正交基就是基矢量为1的正交基。
4.矩阵的几何意义在于变换,常见的变换有旋转,缩放,平移等,分别如下:
旋转:
平移:
缩放:
子空间C到父空间P的变换矩阵:
其中x,y,z分别表示子空间C内x,y,z轴矢量,o表示子空间原点矢量
父空间P到子空间C的变换矩阵:就是将上面子空间到父空间变换矩阵求反就行了,如果子空间到父空间的变换矩阵时正交矩阵,根据正交矩阵的特效,可以取变换矩阵的倒置矩阵等价于逆矩阵,从而获取父空间到子空间的变换矩阵。
法线变换:法线和切线是垂直的,所以法线向量和切线向量的点积为0,要想获取法线向量的变换矩阵,可以使用切换的变换矩阵进行表示,最终发现的变换矩阵为:
其中M(a->b)表示切线的变换矩阵
透视投影:投影矩阵如下
其中判定经过该矩阵变换的位置满足-w <= x or y or z <= w时表示变换后位置不需要裁剪,就在裁剪空间内,否则就需要进行裁剪
正交投影:投影矩阵如下
其中判定经过该矩阵变换的位置满足-w <= x or y or z <= w时表示变换后位置不需要裁剪,就在裁剪空间内,否则就需要进行裁剪
透视除法:就是将观察空间转换到裁剪空间的位置分量x,y,z分别于w相除,从而将得到的坐标转移到立方体内。
屏幕空间位置计算公式:unity中已经自动帮我们进行了透视除法和坐标映射,最终获取一个二维屏幕坐标,我们只需要将观察空间坐标变换到裁剪空间坐标即可(也就是通过透视投影或者正交投影进行变换),剩下的工作交给unity自动完成。
相关文章推荐
- Unity Shader入门精要学习笔记 - 第4章 学习 Shader 所需的数学基础
- Unity Shader入门精要 数学基础之齐次坐标系
- Unity Shader入门精要笔记(三):Unity Shader数学基础
- Unity Shader学习笔记:基础数学
- Unity Shader入门精要学习笔记 - 第4章 学习 Shader 所需的数学基础
- 第4章 学习Shader所需的数学基础(终)(Unity Shader内置变量与练习题答案)
- UnityShader入门精要学习笔记(二):数学知识
- Unity shader 官网文档全方位学习(一)————Surface Shaders基础及Examples详尽解析
- Unity Shader入门精要学习笔记 - 第4章 学习 Shader 所需的数学基础
- 关于Unity中的3D数学基础知识<三>矩阵的基础知识和使用
- Unity_Shader开发_图形学基础(五)--------2016.1.9
- shader数学基础之法线贴图切线空间
- 【Shader基础篇】之基础数学
- [Unity基础]从“漫反射光照模型”了解Unity Shader渲染原理
- Unity Shader基础【三】- Unity ShaderLab语法基础
- Unity基础.004数学基础类:Time、Random以及Mathf
- 【Unity】Shader编程 基础总结
- [UnityShader基础]LOD
- Unity_Shader开发_数学(四)---------2016.1.6
- Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照