unity shader入门精要_shader入门数学基础矩阵篇

27de00711f4aac24f913476acb6aa193.png

一,简单介绍下几个概念。

1)线性空间:

实际上就是向量空间,一切的计算都是合理且符合数学规律的。例如在线性空间中1+1 = 2。在非线性空间中,1+1=0.7。这个例子很好解释了线性空间的概念。Gama空间就是典型的非线性空间,这里主要讨论矩阵,就不展开分析了。

2)矩阵和向量的本质:

向量的本质是物体(长宽高朝向之类的),矩阵的本质是物体的运动。基本上所有矩阵的运算,都是在对物体做运动。(这个物体是广义上的,包括坐标啊之类的,模型空间坐标到裁剪空间坐标的变换也看做是一种运动)。

二,矩阵与向量的结合

向量可以看成是nX1的列矩阵和1Xn的行矩阵。

三,矩阵运算

1,与常数相乘

公式见下图(知乎找了半天打不了矩阵orz)

206a30f736c94b61873af431ca1ba2d2.png

2,矩阵与矩阵相乘

1)设A为rXn,B为nXl

也就是说,只有A的列数 ==B 的行数,才能相乘。

2)公式法(冗长的公式,我一般不用,这里只是理性列出来)

这个公式的意思就是,

中每一个元素
等于
行与
列的点积。

3)向量法(实际上和公式法本质一样,但是我感觉直观多了)

意思是把矩阵的行列,当作向量来看,从而直接写出点积。举个栗子。

0e317a43f2741c7105b84d6dce8a4b9a.png

可以看出来,左边矩阵的行是向量,右边矩阵列是向量。最终结果就是这两种向量的点积。最终矩阵的结果可以看出规律,行上面行不变列变,列上面列不变行遍。

fbd13e8ba728f93b6aa7e3c6cba9d385.png

bc5be85e4efc2d07d6d2e8afed49ff7b.png

然后就把点积算出来就行了。

手动算矩阵很累,一般来说在unity中,有提供的矩阵可以用,程序也可以自动帮助运算矩阵。

3,转置

转置的英文是:transpose 所以转置矩阵用上标

来表示。

举个栗子,顺便用ps告诉你,转置对矩阵进行了什么操作。

4b3209d0c4d97b46d6a90f8d73d59892.png

反折+旋转,就可以得到转置矩阵了。

重要性质:

1)矩阵转置的转置等于原矩阵:

2)矩阵相乘(也叫串接)的转置,等于矩阵反向相乘(反响串接)各个矩阵的转置:

4,逆矩阵

不是所有矩阵都有逆矩阵,必须满足下列条件

1)必须是方阵(行列数一样)

2)行列式不为0,非奇异矩阵

入门精要中并没有讨论如何手动求逆,据说是十分复杂,那在这里我们也不必去讨论了,真要是求逆,程序提供的算法会帮我们自动完成。

重要性质:

1)

矩阵和它的逆矩阵相乘等于单位矩阵

2)

矩阵逆矩阵的逆矩阵等于它本身

3)

单位矩阵的逆矩阵等于单位矩阵本身

4)

矩阵转置取逆等于矩阵取逆的转置

5)

矩阵相乘的取逆,等于矩阵反向相乘各个矩阵的取逆

6)有向量

。我们利用矩阵
进行一次变换,用
再进行一次变换,就会得到原来的向量

是单位矩阵)

运算率:

1)*

(矩阵分左右乘,左右结果是不一样的)

2)结合律 :

3)分配律(分左右两部分):

4)和常数相乘:

5,特殊矩阵

方阵(行列数都相等的矩阵)

1) 逆矩阵(上文已经提到,逆矩阵属于方阵下面的子集)

2) 对角矩阵

一个矩阵如果除了对角线之外,其他元素都为0,那么我们称这个矩阵为对角矩阵

(1)普通对角矩阵

90a0a3c5fa01c9559f584956b3f881e0.png

(2)单位矩阵

(对角线的元素都为1,其他元素都为0)

53b4c437f3bce7c2737e77654b6fac8e.png

单位矩阵就是矩阵界的“1”。它的性质和地位都和常数里的“1”类似。比如任何矩阵和单位矩阵相乘都等于这个矩阵本身。

3)正交矩阵

如果

,那么我们就说这是一个正交矩阵。

公式一般都会看的一脸懵逼,但是举个栗子就懂了。

ca0d39820b439301188fa6ccdd9dd455.png

3811e173a90abc7f9b4515054b086082.png

在正交矩阵中,向量

,
,
是单位向量并且相互垂直。

正交矩阵还有一个很重要的性质是:

也就是说,正交矩阵的转置 ==它的逆矩阵。

这个有啥用呢?首先明确一下,在计算机运算中,求逆的运算量远远大于转置,shader因为是游戏中需要实时跑的东西,对性能的要求极高。所以,在shader计算中,能用转置就别求逆。一旦你确定你的矩阵是个正交矩阵,你又需要用它的逆矩阵,那么,对这个矩阵转置即可。省了很多性能,并且结果一致。

矩阵的东西目前就记录到这里,比较浅显(以后有需要了再深入)。下一篇讲一讲渲染流程和unity内置矩阵的应用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在本文章中,我们将从一个简单的 Unlit Shader 开始,了解如何在 Unity 的 URP 中编写 Shader。 Unlit Shader 是最基本的 Shader 之一,它不考虑任何光照,只对物体进行纯色渲染。这是一个非常适合初学者的 Shader,因为它可以让我们更好地理解 Shader 的基本结构和语法。 首先,我们需要创建一个新的 Shader,选择 URP 中的 Universal Render Pipeline/Lit Shader,并将其重命名为 Unlit。 接下来,打开 Shader 文件,我们可以看到 Shader 的基本结构如下: ``` Shader "Custom/Unlit" { Properties { // 定义 Shader 的属性 } SubShader { // 定义 SubShader 的标签和 Tags Pass { // 定义 Pass 的标签和 Tags CGPROGRAM // Shader 代码 ENDCG } } } ``` 如上所述,Shader 由多个 SubShader 组成,每个 SubShader 又由多个 Pass 组成。在这里,我们只需要关注一个 SubShader 和一个 Pass。 首先,我们需要在 Properties 中定义 Shader 的属性。这些属性可以在材质面板中进行编辑和调整。对于 Unlit Shader,我们只需要定义颜色属性即可,代码如下: ``` Properties { _Color ("Color", Color) = (1,1,1,1) } ``` 上述代码定义了一个名为 _Color 的属性,类型为 Color,初始值为白色。在这里,我们使用了 UnityShaderLab 语言来定义属性。 接下来,我们需要在 SubShader 中定义标签和 Tags。标签和 Tags 是用来控制 Shader 的渲染和使用的,我们需要根据实际情况进行定义。 对于 Unlit Shader,我们只需要定义一个名为 "RenderType" 的标签,值为 "Opaque",表示这个 Shader 用于不透明的渲染。代码如下: ``` Tags { "RenderType"="Opaque" } ``` 最后,我们需要在 Pass 中编写 Shader 代码。对于 Unlit Shader,我们只需要将颜色值直接输出即可,代码如下: ``` CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; }; struct v2f { float4 vertex : SV_POSITION; }; float4 _Color; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); return o; } fixed4 frag (v2f i) : SV_Target { return _Color; } ENDCG ``` 在上述代码中,我们定义了两个结构体 appdata 和 v2f,分别代表输入和输出数据。在 vert 函数中,我们将输入的顶点位置转换为屏幕空间的位置,并将其保存到输出中。在 frag 函数中,我们直接返回颜色值,这样就能够实现纯色渲染了。 最后,我们需要将 Shader 保存,并将其赋给一个材质。在材质面板中,我们可以看到 _Color 属性,可以通过这个属性来修改材质的颜色。 这就是从一个简单的 Unlit Shader 开始,在 Unity 的 URP 中编写 Shader 的全部过程。希望本文对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值