UnityShader学习教程之<数学基础向量和矩阵>

基础篇(二)

向量

点,向量和标量的区别
点是一个没有大小之分的空间中的位置
向量是一个有模有方向但是没有位置的量
标量是一个只有模没有方向的量

向量和向量的加法:
A+B = (Ax+bx,Ay+By)
向量和向量的减法:
A-B = (Ax-bx,Ay-By)
注意:向量不能和标量相加减,不能和维度不一样的向量相加减
向量和标量的除法:
A/a = (Ax/a,Ay/a)
向量和标量的乘法:
Aa = (Axa,Ay*a)
对于加减法:我们有三角形法则求距离
对于乘除法:我们可以求缩放
向量的模:
|A| = 每个分量的平方和然后开平方
向量的点积:
A.B = Ax.Bx+Ay.By+Az.Bz
意义:A点乘B向量代表B在A上面的投影,当结果大于0,方向为正,反之,方向为反
A.B=|A|.|B|.Cos@
我们可以通过角度的余弦值,来知道两个向量之间的方向关系
向量的叉积:
AxB = (AyBz-AzBy,AzBx-AxBz,AxBy-AyBx)
叉乘用来求垂直于AB平面的向量,求副切线


矩阵

矩阵在shader中的应用

float2 centerUV = float2(0.5,0.5);//中心点
float rotaNormalAngle =(_BumpAngle * PI)/180;//旋转角度
float CosNormalAngle = cos(rotaNormalAngle);//余弦值
float SinNormalAngle = sin(rotaNormalAngle);//正弦值				
float2 uvnormal = (mul(float3(i.uvnormal-centerUV,1),float3x3(1,0,0,0,1,0,_BumpShiftX,_BumpShiftY,1))).xy;//这是处理uv坐标,所以使用的是3维的平移矩阵
uvnormal = mul(uvnormal,float2x2(_BumpRepeat,0,0,_BumpRepeat));//2维缩放矩阵
uvnormal = mul(uvnormal,float2x2(CosNormalAngle,-SinNormalAngle,SinNormalAngle,CosNormalAngle)) + centerUV;//2维旋转矩阵

矩阵是3D数学的重要基础,它主要用来描述两个坐标系统之间的关系,通过定义一种运算而将一个坐标系中的向量转换到另一个坐标系。
向量是标量的数组,矩阵是向量的数组
矩阵的维度

这里写图片描述

矩阵的维度被定义为它包含了多少行和多少列,上面这个矩阵为4x3的矩阵,我们表示矩阵当中的某个元素,一般用Mij来表示,i表示行,j表示列。
方阵
行数和列数相同的矩阵被称为是方阵

这里写图片描述

方阵行数和列数一样的元素被称为对角线元素,其他元素均为非对角线元素
对角矩阵:如果所有非对角线元素都为0
单位矩阵:一种特殊的对角矩阵,n维单位矩阵记作In,是nxn的矩阵,对角线的元素为1,其他元素为0.单位矩阵非常特殊,他是矩阵的乘法单位元,基本性质是用任意一个矩阵乘以单位矩阵,都将得到原来的矩阵。

注意:对角线的元素只有一条,并不包括另外一条.

转置
矩阵的转置就是把矩阵沿x轴旋转180度,然后沿z轴顺时针旋转90度
(书上写的沿着矩阵的对角线翻折)

这里写图片描述
定理
1.对于任意矩阵,将一个矩阵转置一次,再转置一次便会得到原来的矩阵,这条法则也适用于向量
2.对于任意对角矩阵,都有这个矩阵的转置矩阵等于它自己

矩阵的运算
矩阵和标量的乘法
矩阵M和标量k相乘
这里写图片描述

简而言之,就是用k去乘以矩阵中的每个元素,矩阵样式不变
矩阵与矩阵的乘法:
条件:矩阵M和矩阵N相乘,M的行数必须和N的列数一样,否则,乘法无意义
这里写图片描述

c1 = a1b1 + a2b4
行和列相乘
注意事项
矩阵乘法不满足交换律
矩阵乘法满足结合律
矩阵积的转置等于先转置矩阵然后以相反的方向乘

向量和矩阵的乘法
1.行向量左乘矩阵,结果是行向量
2.列向量右乘矩阵,结果是列向量
反之,则无定义
DirectX使用的是行向量
等式中使用列向量更好
OpenGL使用列向量

矩阵的几何解释
矩阵是如何变换向量的?
这里写图片描述

如果把矩阵的行解释为坐标系的基向量,那么乘以该矩阵就相当于执行了一次坐标变换,如果有aM =b,那么我们就说M将a转换到b.

矩阵的形式:
矩阵的每一行都能理解为转换之后的基向量

矩阵和线性变换:
变换物体和变换坐标系
变换物体:将一个物体顺时针旋转90度,意味着旋转物体上的点,坐标移动到了一个新的位置
变换坐标系:当我们旋转坐标系的时候,物体本身并没有移动,只是我们在另外一个坐标系中描述它
两种变换实际上是等价的,将物体变换一个量,等价于将坐标系变换一个相反的量

旋转矩阵的推导
这里写图片描述
我们可以根据三角函数cosθ = x/斜边,而且我们知道斜边的长度为1,所以x = cosθ
同理y = sinθ,因此p点的坐标可以表示为p(cosθ,sinθ).
同理,我们也可以用三角函数求得q的坐标q(-sinθ,cosθ).
然后我们可以组合一个2D的旋转矩阵
这里写图片描述

这里只是列举了2d旋转矩阵的推导,3d的旋转矩阵也差不多,只不过绕某个轴旋转的时候,保持这个轴不动就行。

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

绕任意轴n,角度θ的旋转矩阵

缩放矩阵的推导:
这里写图片描述

如果要对p点进行缩放,那么我们直接改变的就是在p的基础坐标上进行缩放,只需要在p的坐标乘或者除以某个系数既可
由此我们可以推导二维缩放矩阵:
这里写图片描述
矩阵N对二维向量进行缩放,缩放系数为x,y

这里写图片描述
扩充的三维缩放矩阵

这里写图片描述
沿着3d任意轴的缩放矩阵,n为方向,k为缩放因子

平移矩阵
平移不属于线性变换
因为平移不会改变方向,所以我们需要增加一个维度,对当前的向量进行平移操作
这里写图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深入学习Unity Shader学习图形学知识和URP渲染管线,可以按照以下步骤进行: 1. 学习基础知识:首先,了解图形学的基本概念和原理,包括光照、阴影、纹理映射等。可以阅读相关的图形学教材或者在线资源,掌握相关的数学知识,如向量矩阵等。 2. 学习Shader语言:Unity使用的是一种类似于C的着色器语言,称为ShaderLab。学习ShaderLab语言,并了解Unity Shader的基本语法和结构是非常重要的。可以参考Unity官方文档和教程,也可以寻找一些书籍或在线教程学习。 3. 实践编写Shader:通过实践编写自己的Shader来加深对Shader语言的理解和应用。可以从简单的表面着色器开始,逐步探索更复杂的效果,如法线贴图、镜面反射等。可以参考Unity官方文档的示例和教程,也可以寻找一些开源的Shader代码来学习。 4. 学习URP渲染管线:URP(Universal Render Pipeline)是Unity提供的高性能、可定制的渲染管线。学习URP渲染管线可以帮助你理解渲染过程和优化技术。可以阅读Unity官方文档关于URP的介绍和教程,也可以参考一些社区资源和教程。 5. 参考资源:除了官方文档和教程外,还可以参考一些优秀的书籍、博客和视频教程来加深对Unity Shader图形学知识的理解。一些推荐的资源包括《Unity Shader入门精要》、《Unity Shader之高级进阶》、CSDN博客等。 记住,学习Shader图形学是一个需要不断实践和探索的过程,通过不断尝试和学习,你会逐渐掌握这些知识并且提升自己的技能。祝你学习顺利!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值