UnityShader入门精要笔记(3)——数学基础

Unity的数学基础

一、Unity使用的坐标系

  • 对于模型空间和世界空间,Unity使用的是左手坐标系
  • 对于观察空间,Unity使用的是右手坐标系

二、矩阵的变换类型

1、线性变换:满足以下条件的函数

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

2、平移变换:满足标量乘法,但不满足矢量加法

3、仿射变换:合并线性变换和平移变换的变换类型。

  • 仿射变换使用一个4*4的矩阵表示。
  • 把矢量扩展到四维空间下,同时这也称之为齐次坐标空间。

4、常见的变换种类和他们的特性(N表示不满足,Y表示满足)

变换名称 线性变换 仿射变换 可逆矩阵 正交矩阵
平移矩阵 N Y Y N
绕坐标轴旋转的旋转矩阵 Y Y Y Y
绕任意轴旋转的旋转矩阵 Y Y Y Y
按坐标轴缩放的缩放矩阵 Y Y Y N
错切矩阵 Y Y Y N
镜像矩阵 Y Y N N
正交投影矩阵 Y Y N N
透视投影矩阵 N N N N

5、旋转矩阵的顺序

当直接给出(x,y,z),这样的旋转角度时,在Unity中,旋转顺序是zxy。

6、矩阵变换顺序

先缩放、再旋转,最后平移

三、顶点的空间变换过程

1、顺序

模型空间 --(模型变换)–> 世界空间 --(观察变换)–> 观察空间 --(投影变换)–> 裁剪空间 --(屏幕映射)–> 屏幕空间

2、模型空间

又称对象空间、局部空间,满足左手坐标系,模型空间的原点和坐标轴由美术人员在建模软件中确定好。
导入Unity后,可以在顶点着色器中访问到模型的顶点信息。

3、世界空间

Unity中的世界坐标。
绝对坐标

4、观察空间

又称摄像机空间,符合右手坐标系,以摄像机为原点,+x轴指向右方,+y轴指向上方,+z轴指向摄像机后方。

5、裁剪空间

又称齐次裁剪空间,符合左手坐标系。裁剪空间由视锥体决定,该视锥体指的就是在unity中摄像机照射的空间。
有两种类型:

  • 正交投影:完全保留物体的距离和角度
  • 透视投影:模拟人眼看世界的方式

6、屏幕空间

经过这一步变换后,得到真正的像素位置。
过程步骤:

  • 齐次除法,也被称为透视除法。即用齐次坐标系的w分量去除以x、y、z分量
  • 通过缩放,映射到屏幕空间

四、法线变换

1、在游戏中,模型的一个顶点往往会携带额外的信息,例如法线、切线等。

2、法线:normal,切线:tangent

五、UnityShader的内置变量

变量名 描述
UNITY_MATRIX_MVP 当前的模型·观察·投影矩阵,用于将顶点/方向矢量从模型空间变换到裁剪空间
UNITY_MATRIX_MV 当前的模型·观察矩阵,用于将顶点/方向矢量从模型空间变换到观察空间
UNITY_MATRIX_V 当前的观察矩阵,用于将顶点/方向矢量从世界空间变换到观察空间
UNITY_MATRIX_P 当前的投影矩阵,用于将顶点/方向矢量从观察空间变换到裁剪空间
UNITY_MATRIX_VP 当前的观察·投影矩阵,用于将顶点/方向矢量从世界空间变换到裁剪空间
UNITY_MATRIX_T_MV UNITY_MATRIX_MV的转置矩阵
UNITY_MATRIX_IT_MV UNITY_MATRIX_MV的逆转置矩阵,用于将法线从模型空间变换到观察空间,也可用于得到UNITY_MATRIX_MV的逆矩阵
_Object2World 当前的模型矩阵,用于将顶点/方向矢量从模型空间变换到世界空间
_World2Object _Object2World的逆矩阵,用于将顶点/方向矢量从世界空间变换到模型空间

六、Unity内置的摄像机和屏幕参数

变量名 类型 描述
_WorldSpaceCameraPos float3 该摄像机在世界空间中的位置
_ProjectionParams float4 x=1.0(或-1.0,如果正在使用一个翻转的投影矩阵进行渲染),y=Near,z=Far,w=1.0+1.0/Far,其中Near和Far分别是近裁剪平面和远裁剪平面和摄像机的距离
_ScreenParams float4 x=width,y=height,z=1.0+1.0/width,其中width和height分别是该摄像机的渲染目标(render target)的像素宽度和高度
_ZBufferParams float4 x=1-Far/Near,y=Far/Near,z=x/Far,w=y/Far,该变量用于线性Z缓存中的深度值
unity_OrthoParams float4 x=width,y=height,z没有定义,w=1.0(该摄像机是正交摄像机)或w=0.0(该摄像机是透视摄像机),其中width和height是正交投影摄像机的宽度和高度
unity_CameraProjection float4*4 该摄像机的投影矩阵
unity_CameraInvProjection float4*4 该摄像机的投影矩阵的逆矩阵
unity_CameraWorldClipPlanes[6] float4 该摄像机的6个裁剪平面在世界空间下的等式,按如下顺序:左、右、下、上、近、远裁剪平面

七、注意事项

  • CG使用的是行优先的方法

你可能感兴趣的:(Unity,unity,shader)