Shader入门精要总结(二)矩阵

1. 矩阵乘法

一个r×n的矩阵A和一个n×c的矩阵B相乘,它们的结果AB将会是一个r×c大小的矩阵,不满足此规则不能相乘
矩阵乘法满足一些性质

  • 矩阵乘法不满足交换律
    ABBA
  • 矩阵乘法满足结合律
    (AB)C=A(BC)

2. 特殊矩阵

  • 方块矩阵
    指行和列数目相等的矩阵,最常用的是3×3和4×4方阵,如果一个矩阵除了对角元素外的所有元素都为0,那么这个矩阵就叫对角矩阵

  • 单位矩阵
    一个特殊的对角矩阵是单位矩阵,一个3×3的单位矩阵如下
    在这里插入图片描述
    任何矩阵和单位矩阵相乘的结果都是原来的矩阵
    在这里插入图片描述

  • 转置矩阵
    给定一个r×c矩阵M,转置为 M T M^T MT,这是一个c×r的矩阵
    其有两个性质
    性质一:矩阵转置的转置等于原矩阵
    性质二:矩阵串接的转置,等于反向串接各个矩阵的转置,即
    ( A B ) T (AB)^T (AB)T= B T B^T BT A T A^T AT

  • 逆矩阵
    不是所有矩阵都有逆矩阵,前提是该矩阵必须是一个方阵
    满足 M M M M − 1 M^{-1} M1= M − 1 M M^{-1}M M1M= I I I
    其有四个性质
    性质一:逆矩阵的逆矩阵是原矩阵本身
    ( M − 1 ) − 1 = M (M^{-1})^{-1}=M (M1)1=M
    性质二:单位矩阵的逆矩阵是它本身
    I − 1 = I I^{-1}=I I1=I
    性质三:转置矩阵的逆矩阵是逆矩阵的转置
    ( M T ) − 1 (M^T)^{-1} (MT)1= ( M − 1 ) T (M^{-1})^T (M1)T
    性质四:矩阵串接相乘后的逆矩阵等于反向串接各个矩阵的逆矩阵
    ( A B ) − 1 = B − 1 A − 1 (AB)^{-1}=B^{-1}A^{-1} (AB)1=B1A1

  • 正交矩阵
    如果一个方阵 M M M和它的转置矩阵的乘积是单位矩阵的话,这个矩阵就是正交的
    M M T = M T M = I MM^{T}=M^{T}M=I MMT=MTM=I
    如果一个矩阵是正交的,那么它的转置矩阵和逆矩阵是一样的
    M T = M − 1 M^{T}=M^{-1} MT=M1

3. 行矩阵还是列矩阵

在Unity中,常规做法是把矢量放在矩阵右侧,即把矢量转换成列矩阵来进行运算,这意味着,矩阵乘法通常是右乘
C B A v = ( C ( B ( A v ) ) ) CBAv=(C(B(Av))) CBAv=(C(B(Av)))
阅读顺序从右往左,上面等价于
v A T B T C T = ( ( ( v A T ) B T ) C T ) vA^{T}B^{T}C^{T}=(((vA^{T})B^{T})C^{T}) vATBTCT=(((vAT)BT)CT)

4. 矩阵变换

  • 变换
    线性变换指那些可以保留矢量加和标量乘的变换,即
    f ( x ) + f ( y ) = f ( x + y ) f(x)+f(y)=f(x+y) f(x)+f(y)=f(x+y)
    k f ( x ) = f ( k x ) kf(x)=f(kx) kf(x)=f(kx)
    缩放就是一种线性变换,旋转也是,对于线性变换来说,如果要对一个三维矢量进行变换,那么仅仅3x3的矩阵就可以表示所有线性变换,线性变换除了旋转和缩放,还包括错切,镜像,正交投影等
    平移变换不是一个线性变换,这样,就有了仿射变换,就是合并线性变换和平移变换的类型,仿射变换可以用一个4x4的矩阵表示,为此,需要把矢量扩展到四维空间下,这就是齐次坐标空间

  • 齐次坐标
    对于一个点,从三维坐标转换成齐次坐标是把其 w w w分量设为1,而对于方向矢量来说,需要把其 w w w分量设置为0
    我们把表示纯平移,纯旋转,纯缩放的的变换矩阵叫做基础变换矩阵,一个基础变换矩阵可以分解成4个部分:
    [ M 3 × 3 t 3 × 1 0 1 × 3 1 ] \begin{bmatrix} M_{3×3}& t_{3×1}\\ 0_{1×3}& 1\\ \end{bmatrix} [M3×301×3t3×11]
    左上角的矩阵 M 3 × 3 M_{3×3} M3×3用于表示旋转和缩放, t 3 × 1 t_{3×1} t3×1表示平移, 0 1 × 3 0_{1×3} 01×3是0矩阵,即
    [ 0 0 0 ] \begin{bmatrix} 0& 0& 0\\ \end{bmatrix} [000]
    右下角的元素就是标量1

  • 平移矩阵
    可以使用矩阵乘法来表示对一个点的平移变换
    在这里插入图片描述
    如果对一个方向矢量进行平移变化
    在这里插入图片描述
    可以发现,平移变化不会对方向矢量产生影响,即矢量没有位置属性,也就是说它可以位于空间中任意一点

  • 缩放矩阵
    对于一个点进行缩放
    在这里插入图片描述
    对于一个方向矢量
    在这里插入图片描述
    如果缩放系数 k x = k y = k z k_{x}=k_{y}=k_{z} kx=ky=kz,这样的缩放为统一缩放,否则为非统一缩放,从外观看,统一缩放是扩大整个模型,而非统一缩放会拉伸或挤压模型,更重要的是,统一缩放不会改变角度和比例信息,而非统一缩放会改变与模型相关的角度和比例,缩放矩阵一般不是正交矩阵

  • 旋转矩阵
    如果把点绕x轴旋转,可以使用下面的矩阵:
    在这里插入图片描述
    绕y轴旋转
    在这里插入图片描述
    绕z轴旋转
    在这里插入图片描述
    旋转矩阵是正交矩阵,而且多个旋转矩阵之间的串联同样是正交的

  • 复合变换
    在大多数情况下,约定矩阵的变换顺序是先缩放,再旋转,最后平移
    对于旋转来说,在Unity中,旋转的顺序是zxy

5. 坐标空间

  • 屏幕空间
    经过投影变换后,进行裁剪操作,当完成了所有裁剪工作后,就需要进行真正的投影了,也就是说需要把视椎体投影到屏幕空间
    首先,需要进行齐次除法,就是用齐次坐标系的 w w w分量去除 x y z xyz xyz分量,在OpenGL中,这一步得到的坐标叫做归一化的设备坐标(NDC),经过这一步后,可以把坐标从齐次裁剪坐标空间转换到NDC中,。经过透视投影变换后的裁剪空间。经过齐次除法后会变换到一个立方体内。按照OpenGL的传统,这个立方体的 x y z xyz xyz分量的范围都是[-1,1],但在DX中, z z z的分量范围会是[0,1]。Unity选择的是OpenGL的齐次裁剪空间
    在这里插入图片描述
  • 总结
    在这里插入图片描述
    在这里插入图片描述
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要理解shader入门精要,首先需要了解shader是指令代码,需要关联材质才能赋予游戏对象以特定的效果。材质按照关联的shader的规则,处理贴图等输入信息,达到特定的画面效果。 在Unity中,有几种类型的shader可供选择。一种是表面着色器(Surface Shader),它是对顶点/片断着色器的封装,更符合人类的思维模式,可以以极少的代码来实现不同的光照模型和不同平台下的需求。在表面着色器的开发中,我们直接在Subshader层次上编写代码,系统会将代码编译成适当的Pass。而顶点/片断着色器是更基础的shader类型,能够实现更多的效果,但表面着色器不一定能实现这些效果。还有一种被淘汰的固定管线着色器(Fixed Function Shaders),它在硬件上执行基本的命令,速度很快,但功能有限,不再推荐使用。 不同图形API都有各自的shader语言。在DirectX中,顶点shader叫做Vertex Shader,像素shader叫做Pixel Shader。而在OpenGL中,顶点shader也叫做Vertex Shader,但像素shader叫做Fragment Shader或者片断Shader。这些shader语言有不同的语法和特性,需要根据使用的图形API选择适当的语言来编写shader总结起来,要入门shader,首先需要了解shader是指令代码,需要关联材质才能实现效果。在Unity中,可以选择使用表面着色器、顶点/片断着色器或固定管线着色器来实现不同的效果。此外,不同图形API有不同的shader语言,需要根据使用的API选择合适的语言来编写shader
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值