Unity Shader数学基础——矩阵

矩阵的定义

由m×n个数a,排成的m行n列的数表称为m行n列的矩阵,简称m×n矩阵。记作:

这m×n个数称为矩阵A的元素,简称为元,数a位于矩阵A的第i行第j列,称为矩阵A的(i,j)元,以数a为(i,j)元的矩阵可记为(a)或(a)m×n,m×n矩阵A也记作Amn。

元素是实数的矩阵称为实矩阵,元素是复数的矩阵称为复矩阵。而行数与列数都等于n的矩阵称为n阶矩阵或n阶方阵。

矩阵基本运算

加法

矩阵的加法满足下列运算律(A,B,C都是同型矩阵):

应该注意的是只有同型矩阵之间才可以进行加法

减法

数乘

矩阵的数乘满足以下运算律

转置

把矩阵A的行和列互相交换所产生的矩阵称为A的转置矩阵(Aᵀ ),这一过程称为矩阵的转置。

    

性质一: 矩阵转置的转置等于原矩阵。(Mᵀ )ᵀ =M   

性质二:矩阵串接的转置,等于反向串接各个矩阵的转置。(AB)ᵀ =Bᵀ Aᵀ                                    

矩阵乘法

两个矩阵的乘法仅当第一个矩阵A的列数和另一个矩阵B的行数相等时才能定义。如A是m×n矩阵和B是n×p矩阵,它们的乘积C是一个m×p矩阵

矩阵的乘法满足以下运算律:

结合律: (AB)C=A(BC)

左分配律: (A+B)C=AC+BC

右分配律: C(A+B)=CA+CB

矩阵乘法不满足交换律。

特殊矩阵

方块矩阵

方块矩阵简称方阵,是指那些行和列数目相等的矩阵。在三维渲染里最常用的就是3X3和4X4的方阵。

矩阵的一些运算和性质只有方阵才具有。例如,对角元素。方阵的对角元素指的是行号和列好相等的元素,把方阵看做一个正方形的话,那些元素排列在正方形的对角线上。如果一个矩阵除了对角元素外的所有元素都为0,那么这个矩阵就叫做对角矩阵。

单位矩阵

一个特殊的对角矩阵是单位矩阵,用In来表示。

逆矩阵

不是所有的矩阵都有逆矩阵,前提他必须是一个方阵。

给定一个方阵M,他的逆矩阵用M⁻¹ 来表示。逆矩阵最重要的性质就是,如果我们把M和M⁻¹相乘,那么他们的结果将会是一个单位矩阵。MM⁻¹=M⁻¹M=I;

性质一:逆矩阵的逆矩阵是原矩阵本身。

性质二:单位矩阵的逆矩阵是他本身。

性质三:转置矩阵的逆矩阵是逆矩阵的转置。(MT)⁻¹=(M⁻¹)T

性质四:矩阵串接相乘后的逆矩阵等于反向串接各个矩阵的逆矩阵。(AB)⁻¹=B⁻¹A⁻¹

正交矩阵

正交是矩阵的一种属性。如果一个方阵M和他的转置矩阵的乘积是单位矩阵的话,那我们就说这个矩阵是正交的。反过来也是成立的。MMᵀ =Mᵀ M=I。

矩阵的几何意义

在游戏世界中,变换一般包含旋转,缩放,平移。开发人员希望给定一个点或者矢量,再给定一个变换,就可以通过某个数学运算来求得新的点和矢量。

变换是指,我们把一些数据,如点,方向矢量甚至颜色等,通过某种方式进行转换的过程。在计算机图形学领域,变换非常重要。尽管通过变换我们能够进行的操作是有限的,但是这些操作已经足够奠定变换在图形学领域举足轻重的地位了。

线性变换。线性变换指的是那些可以保留矢量加和矢量乘的变换。缩放就是一种线性变换。旋转也是一种线性变换,如果我们要对一个三维矢量进行变换,那么仅用3X3的矩阵就可以表示所有的线性变换。

线性变换除了旋转和缩放以为,还包括错切,镜像,也被称为正交投影等。

但是一般的线性变换还是不够的,我们来考虑平移变换就不是一个线性变换。

这样我们就有了仿射变换。仿射变换就是合并线性变换和平移变换的变换类型,仿射变换可以用一个4X4的矩阵来表示,为此我们需要吧矢量扩展到四维空间下,这就是齐次坐标空间。

齐次坐标

由于3X3的矩阵不能代表平移操作,我们需要将其扩展到4X4的矩阵,为此,我们还需要把原来的三维矢量转换成四位矢量,也就是我们说的齐次坐标。

齐次坐标是一个四维矢量。

平移矩阵

缩放矩阵

旋转矩阵

复合变换

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity Shader中,求取法线矩阵的逆矩阵通常是为了进行光照计算,尤其是在使用了表面着色器(Surface Shader)时。法线矩阵是由模型变换矩阵的上3x3部分构成的,用于保持法线向量在空间变换后的方向正确。如果模型变换包含了非均匀缩放,则直接使用模型矩阵的逆转置作为法线矩阵会导致光照计算错误。 法线矩阵(Normal Matrix)是模型变换矩阵中用于变换法线的矩阵,通常是模型矩阵的逆转置(Inverse Transpose)。在Shader中,可以通过内置函数`UNITY_MATRIX_IT_MV`来直接获取模型视图空间下的法线矩阵,或者使用`UNITY_MATRIX_I_MV`获取模型视图空间下的逆转置矩阵,再进行逆矩阵计算。 Unity Shader语言中并没有直接的函数可以获取法线矩阵的逆矩阵,但是可以使用`transpose`函数来得到逆转置矩阵,然后使用`inverse`函数来得到逆矩阵。不过,这通常不必要,因为大多数情况下我们只需要逆转置矩阵来正确变换法线向量。如果确实需要法线矩阵的逆矩阵(而非逆转置矩阵),则需要首先使用`transpose`函数得到逆转置矩阵,然后使用`inverse`函数来计算最终的逆矩阵。 以下是一个简单的例子,展示如何在Unity Shader中获取并使用法线矩阵(逆转置)来变换法线向量: ```csharp Shader "Custom/NormalMatrixExample" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float3 normal : TEXCOORD1; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.normal = UnityObjectToWorldNormal(v.normal); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { // 使用法线矩阵(逆转置)变换法线向量 float3 normal = mul((float3x3)UNITY_MATRIX_IT_MV, i.normal); // 进行光照计算... return fixed4(normal, 1.0); } ENDCG } } FallBack "Diffuse" } ``` 请注意,上面的代码仅用于演示如何获取和使用法线矩阵,并未包含完整的光照模型计算。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值