Shader笔记二 相关数学内容


变换
变换指将一些数据,例如,点,方向矢量甚至颜色,通过某种方式进行转换的过程。
线性变换是非常常见的一种变化类型,满足矢量加和标量乘的变换即为线性变换,即:

f(x)+f(y)=f(x+y)
kf(x)=f(kx)

缩放旋转是一种线性变换,错切镜像正交投影也是线性变化。

平移不属于线性变化,比如f(x)=x+(1,2,3),因为不满足矢量加和标量乘的运算。

线性变换使用3X3的矩阵即可表示,但由于平移变换不属于线性变换,因此无法使用3X3的矩阵来表示平移,需要将矢量扩展到四维空间下,即齐次坐标空间

三维坐标-->齐次坐标空间(w分量设为1)
方向矢量-->齐次坐标空间 (w分量设为0)
当使用4X4矩阵对一个点进行变换时,平移、旋转和缩放会施加于该点,而对于一个方向矢量,平移的效果则会被忽略。

基础变换矩阵
用于表示纯平移纯旋转纯缩放的的变换矩阵为基础变换矩阵。基础变换矩阵的分解:
M(3x3) T(3x1)
0 (1x3) 1
其中,**M(3x3)**用于表示旋转和缩放部分,**T(3x1)**用于表示平移部分

复合变换
平移、缩放和旋转可以组合起来,形成复杂的变化过程。由于矩阵的乘法不满足交换律,因此不同的变换顺序得到的结果是不一样的。绝大多数情况下约定变换顺序为:缩放,旋转,再平移即(Unity中矢量一般化为列矩阵,放在变换右侧运算):

P(new)=M(translation) M(rotation) M(scale) P(old)

这样的运算顺序符合预期,例如位于原点的坐标,先向z平移5个单位,即(0,0,5),再扩大两倍,得到(0,0,10),这样实际上位置已经不符合预期。因此先进行缩放,再旋转,最后平移。

复合旋转同样需要注意旋转的顺序,当给定(θx,θy,θz)的旋转角度,得到的组合变换旋转矩阵为:

Mθz Mθx Mθy

坐标空间的变换
定义一个坐标空间需要其原点位置和3个坐标轴的方向的表示。原点位置和坐标轴的表示实际上是相对于另一个坐标系而言。对坐标空间的变换实际上就是在父空间和子空间之间对点和矢量进行变换。即:

Ap=Mc-p Ac (将子空间的坐标或矢量变换到父空间)
Bc=Mp-c Bp (将父空间的坐标或矢量变化到子空间)

Mc-p表示从子坐标空间变换到父坐标空间的变换矩阵,Mp-c是其逆矩阵。

若已知子坐标空间C中的3个坐标轴在父坐标空间P下的表示 Xc Yc Zc 以及其原点位置 Oc ,给定一个子坐标空间中的一点Ac=(a,b,c)

坐标的变化过程:
Ap=Oc +a Xc +b Yc +c Zc
=(Xoc,Yoc,Zoc)+a(Xxc,Yxc,Zxc)+b(Xyc,Yyc,Zyc)+c(Xzc,Yzc,Zzc)
=((Xoc,Yoc,Zoc)+
|Xxc Xyc Xzc| a
|Yxc Yyc Yzc| b
|Zxc Zyc Zzc| c
原点的加法部分属于平移变换,因此转换到齐次坐标空间下:
|1 0 0 Xoc||Xxc Xyc Xzc 0| a
|0 1 0 Yoc||Yxc Yyc Yzc 0| b
|0 0 1 Zoc||Zxc Zyc Zzc 0| c
|0 0 0 __1|| _0 _0 _0 _1| 1
左侧两个矩阵进一步合并:
|Xxc Xyc Xzc Xoc| a
|Yxc Yyc Yzc Yoc| b
|Zxc Zyc Zzc Zoc| c
| _0 _0 _0 ___1| 1
由此,Mc-p即为:
|Xxc Xyc Xzc Xoc|
|Yxc Yyc Yzc Yoc|
|Zxc Zyc Zzc Zoc|
| _0 _0 _0 ___1|

若是对矢量进行变换的话,平移的过程是不需要的,因为一个矢量平移没有意义,所以矢量的变换矩阵为前3X3:
|Xxc Xyc Xzc|
|Yxc Yyc Yzc|
|Zxc Zyc Zzc|
因此在Shader中,经常会有截取变换矩阵的前3X3对法线方向、光照方向进行空间变换。

这里值得注意的地方,假如Mc-p是一个正交矩阵,那么Mp-c即为Mc-pT (Mc-p-1 = Mc-pT)
这里变换矩阵的 Mc-p 前3X3就是 Xc Yc Zc 分别以列的形式 填充得到的矩阵,若是正交矩阵, 以行的形式 填充矩阵即可得到 Mp-c

顶点的坐标空间变换过程

  • 模型空间
    每个模型都有自己独立的坐标空间,当模型移动或旋转的时候,模型空间也会跟着移动或旋转。

  • 世界空间
    世界空间是关心的最外层的坐标空间,在Unity中,即为场景空间空间。这里有一点注意的是,在Unity中,游戏对象的Transform组件中显示的坐标信息是相对于其父对象的坐标空间的,如果该游戏对象没有父对象,则坐标信息为世界空间的坐标信息。

  • 观察空间
    观察空间可以看做模型空间的一个特列,即摄像机,也可以被称为摄像机空间。Unity中,观察空间的坐标轴的方向为:+x轴指向右方,+y轴指向上方,+z轴指向摄像机的后方,注意观察空间使用的是右手坐标系,摄像机的正前方指向-z轴方向。

  • 裁剪空间
    裁剪空间的目的是能够方便地对渲染图元进行裁剪。处于这个空间内的图元会被保留,位于这个空间外的就会被剔除,与这块相交的图元会被裁剪。裁剪空间由视锥体决定。

  • 屏幕空间
    经过投影矩阵的变换后,可以进行裁剪操作。当裁剪完成后,进行真正的投影,将视锥体投影到屏幕空间,生成对应的2D坐标,得到真正的像素位置。

顶点变换第一步:模型空间-->世界空间
根据游戏对象的Transform信息,得到游戏对象在世界空间中进行的缩放,旋转,平移信息,构建变换矩阵,从右往左,依次是缩放,旋转,平移,得到变换矩阵,顶点坐标根据该变换矩阵运算得到在世界空间下的表示。

顶点变换第二步:世界空间-->观察空间
取得从世界空间到观察空间的变换矩阵有两种方法。
第一种是通过摄像机的Transform组件信息,得到从观察空间到世界空间的变换矩阵,再通过这个变换矩阵求出逆矩阵,即为世界空间到观察空间的变换矩阵。
第二种是通过将摄像机回到世界空间的原点,坐标轴与世界空间坐标轴重合,得到一个变换矩阵,顶点通过与这个矩阵运算得到新的坐标位置,这个坐标的值即为在观察空间下的坐标值,这里有一点需要注意,由于观察空间是右手坐标系,因此得到的变换矩阵还是相当于左手坐标系下,因此还需要做一个变化,使Z轴反向。在该矩阵的基础上乘上:
|1 0 0 0|
|0 1 0 0|
|0 0 -1 0|
|0 0 0 1|

顶点变换的第三步:观察空间-->裁剪空间
观察空间到裁剪空间的转换过程中,不管是透视投影的是视锥体还是正交投影的视锥体,都有对应的透视矩阵进行运算。视锥体是摄像机能够看到的空间。分为两种类型,对应两种投影,分别是透视投影 和 正交投影。如果直接使用视锥体围成的空间对图元进行裁剪,不同的视锥体的处理方式就不一样,而且在透视投影的视锥体下判断一个图元是否在视锥体内计算非常麻烦。因此,通过一个投影矩阵将顶点转换到裁剪空间内能得到一个更加通用的处理过程。在经过投影矩阵的转换之后,齐次坐标空间的w分量会作为一个范围值,如果x,y,z的值在这个范围内,说明该顶点位于裁剪空间内。

顶点变换的第四步:裁剪空间-->屏幕空间
把顶点从裁剪空间投影到屏幕空间中,生成对应的2D坐标,有两个步骤。
步骤1:齐次除法(透视除法)
该过程使用齐次坐标系的w分量去除以x,y,z分量。这一步得到的坐标可以称为归一化设备坐标(NDC)。经过投影矩阵变换得到的裁剪空间,经过齐次除法后,变化到一个立方体内。
步骤2:屏幕映射
这时,变化后的坐标均在[-1,1]内,而在Unity中,屏幕空间的左下角坐标为(0,0),右上角坐标为(pixelWidth,pixelHeight)因此将坐标进行一个映射过程,即:
Pixelx=(1/2 * Xndc+1/2) * pixelWidth
Pixely=(1/2 * Yndc+1/2) * pixelHeight

顶点着色器 的最基本任务是将顶点坐标从模型空间 变换到 裁剪空间,对应着3个变换矩阵,即模型变换 ,观察变换投影变换,在顶点着色器中通常将这三个矩阵串联成一个矩阵,即MVP,用于将顶点坐标从模型空间 变换到 裁剪空间

而从裁剪空间 到 屏幕空间 的转换过程是由Unity完成的,所以顶点着色器只完成顶点从模型空间到裁剪空间即可。

完整的变换过程:

法线变换
法线,即法矢量,变换矩阵可以变换一个顶点或一个方向矢量,但法线是需要特殊处理的一种矢量。
切线,即切矢量,通常与纹理空间对齐,与法矢量垂直。由于切线是由两个顶点通过插值计算得到,因此针对于顶点的变换矩阵应用于切矢量的变换不会出现什么问题。但是法线的变换会面临变换后不垂直的问题。

同一顶点的切线 Ta 与法线 Na 应保持垂直关系 ,即 TaNa =0。在给定变换Ma-b的情况下,变换后的顶点的切线 Tb 与法线 Nb同样应保持垂直关系,Tb =Ma-bTa ,假定 Na 由G矩阵进行变换,变换后,Nb=GNa,变换后:
Ma-bTaGNa=0

Ta(T)Ma-b(T)GNa=0 Ta(T)(Ma-b(T)G)Na=0

(T)表示转置 由于TaNa=0,Ta,Na均为方向矢量,即Ma-b(T)G=I 此时可以满足垂直要求,G=Ma-b(T) 的逆矩阵,即GMa-b 的转置逆矩阵。若Ma-b为正交矩阵,则G=Ma-b,也就是直接使用Ma-b进行法线的变换就可以保证变换后的垂直要求。
如果变换只包含旋转变换,那么Ma-b是正交矩阵,或者这包含旋转和统一缩放,那么统一变换系数为k,则G=1/k(Ma-b),但如果变换中包含了非统一变换,则G 必须通过 Ma-b 的转置逆矩阵进行求解。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值