快速跳转:
1、矩阵变换原理Transform(旋转、位移、缩放、正交投影、透视投影)
2、光栅化(反走样、傅里叶变换、卷积)
3、着色计算(深度缓存、着色模型、着色频率)
4、纹理映射(重心坐标插值、透视投影矫正、双线性插值MipMap、环境光遮蔽AO)
5、几何(距离函数SDF、点云、贝塞尔曲线、曲面细分、曲面简化)
6、阴影映射(Shadow Mapping)
7、光线追踪原理(线面求交、预处理光追加速)
8、辐射度量学与光线追踪
9、蒙特卡洛路径追踪(Path Tracing)(光源采样)
10、材质(BRDF)(折射、菲涅尔项、微表面模型、各向异性材质)
11、渲染前沿技术介绍(双向路径追踪BDPT、MLT、光子映射、实时辐射度、外观建模)
12、相机(视场、曝光、光圈(F-Stop)、薄棱镜近似、CoC、景深)
13、光场、颜色与感知
14、动画(物理模拟、质点弹簧系统、粒子系统、运动学、动作捕捉、欧拉方法)
1 2DTransformations
1.1 Linear Transforms线性变换
定义线性变换为:矩阵×向量
1.2 Scale
1.3 Shear
- 注意观察所有点的y值没发生变化,只有x值变化(x’ = x + ay)
ay怎么来的?计算方法很多,比如通过相似三角形设偏移量为△x,则在y高度上的所有x的增量△x为
y/1 = △x/a, 则△x = ay
切变矩阵为
1.4 Rotation
- 推导过程可设矩阵四个未知量为ABCD,然后带入特殊点(1,0) (0,1)解方程组即可得出ABCD
- 旋转-θ矩阵就是旋转θ的矩阵的逆矩阵,其实直接转置即可。对于旋转矩阵,转置矩阵=逆矩阵
1.5 Translation
- 搞特殊,不是线性变换了
- 这是仿射变换
2 齐次坐标
- 为了解决平移这个特殊的变换,把二维的点和向量都增加一个维度
- 齐次坐标下2D变换矩阵的形式则统一了
3 3DTransformations
- 跟2D一样,齐次坐标下都会增加一维
3.1 Scale
3.2 Translation
3.3 Rotation
- 绕标准轴旋转
- 绕过原点的任意轴旋转
如果绕任意轴旋转怎么描述?先平移到原点,绕过原点轴旋转、平移回去即可
- 一般的3D的变换就可以写成这样
先对各种变换矩阵做乘法合成一个矩阵再应用到目标点
3.4 四元数
四元数的引入是为了更好的描述三维空间的旋转,比较难理解。这里看下面两篇文章详细学习
4 MVP Transformation
4.1 模型变换(Model Transformation)
- 模型的局部空间就是以其自身的中心点或者某个端点为原点所的一个局部坐标系
模型变换
:就是把物体从自身的局部空间转换到世界空间,比如在引擎中导入一个模型,放入场景中,定义他的Transform.position、Transform.rotation、Transform.scale 等同于定义了三个变换矩阵- 总之模型变换就是在世界中摆放模型
4.2 View Transformation
- 也叫做Camera Transform,比较形象,因为主要就是对摄像机进行变换
- 如何在3D空间中描述一个摄像机?仅仅描述位置是不够的
需要Position e、向上单位向量t、向前单位向量g
- View Transform干的什么事情呢?
相机和物体绑定在一起,相机移动到原点,向上的t向量与Y轴重合,g看向-Z轴,其他物体做同样的变换 - 关键的理解:为什么要把物体和相机绑定在一起做变换?—— 方便计算投影变换
因为我们的最终目的是得到一张图像,图像里面是相机所能看到的东西
把相机和物体同步变换到原点,计算投影变得更容易,并且相机和物体相对位置并没发生任何变化,即得到的图像也不会变化
如果相机初始定义的时候,已经看向Z轴(或者-Z)那只需要把它平移到原点就行,不用再乘上一个旋转矩阵
- View Transformatin变换矩阵
-
相机到原点之间做的变换矩阵怎么算?
两个矩阵:平移+旋转,此M不是MVP的M,只是View Matrix的记号
-
Translation矩阵
平移矩阵非常简单,就是把相机移动到原点如下
-
Rotation矩阵
摄像机从他目前的朝向状态,旋转到原点不好算。从原点旋转到相机目前的状态所对应的矩阵则很简单(推导过程省略)
用这个矩阵乘以原点y轴的的单位向量(0,1,0,0)T得到的就是(xt,yt,zt,0)即相机的向上的向量,之后在求其逆矩阵即可。因为旋转矩阵都是正交矩阵,所以旋转矩阵的逆 = 旋转矩阵的转置。从而就得到了Rview
-
- 最终view矩阵Rview
注意:t是up单位向量,g是单位前向量,e是位置这里没用到
1行:g × t 得到的向右的向量的xyz分量 (注意是右手系)
2行:t向量的xyz分量
3行:-g向量的xyz分量
4.3 Projection Transformaion
- 两种投影方式(正交、透视)
4.3.1 正交投影:Orthographic projection
- 图形学中的做法
任意定义一个立方体,用左右上下远近[l,r] [b,t] [f,n] 6个面定义
把这个立方体映射到正则立方体[-1,1]3中,即两次变换(平移+缩放),然后物体会被拉伸,这并不影响结果,因为在得到最后图像之前,会再拉伸回去。
- 对应两次变换的矩阵如下,这就是最终的正交投影矩阵
注意右边这个平移矩阵的记忆,比如(r+l)/2,结果是这个盒子中点的x坐标,如果这个坐标大于零,需要左移才能到原点;小于零,需要右移,所以才有前面的负号
4.3.2 透视投影:Perspective projection
- 透视投影最典型的特点:近大远小,这就是正常人类的视角或者摄像机的视角
- 相当重要的回顾:在齐次坐标下
任何一个点乘上一个非0数,即k(x,y,z,1)=(kx,ky,kz,k)都代表三维中的同一个点(x,y,z) - 怎么做透视投影 —— 仅两步:先挤压(Squish),再正交投影
(1)挤压(Squish)变换
想象把视椎体(Frustum)压成一个方正的盒子(Cuboid),怎么压,矩阵怎么搞?
-
规定:(1)近平面的点永远不变(2)远处平面的Z轴不变(3)远平面中心点不变
-
找特殊点,建立方程组
首先第一个特殊点:在我们取下图所示位于视椎体内部,上平面上的任意点(x,y,z),注意不是远平面上的点
。
-
对于这个特殊点,在投影变换后,会变到
(x',y',z')
上。
挤压后z会怎么变不知道(其实会变远)
但是由于挤压后要做正交投影,变换到(x',y',z')
,正交投影xy是不会变的呀
所以正交投影前,也就是挤压后的点的xy分量,会变成x’y’,根据相似三角形
可得他们之间的关系
这里z、x、n、y都是已知量
-
从这俩就知道很多东西了,在齐次坐标系中做如下操作
把视椎体中的任一点应用M挤压得到新的点,这个点的x,y是刚算出来的已知的点,但z是unknown,
M
p
e
r
s
p
→
o
r
t
h
o
4
×
4
⋅
(
x
y
z
1
)
=
(
n
z
x
n
z
y
?
1
)
…
…
…
…
①
M_{persp\\to ortho}^{4\\times4}·\\Large\\begin{pmatrix} x\\\\y\\\\z\\\\1 \\end{pmatrix} =\\begin{pmatrix} \\frac{n}{z}x\\\\\\frac{n}{z}y\\\\?\\\\1 \\end{pmatrix} \\dots\\dots\\dots\\dots①
Mpersp→ortho4×4⋅⎝
⎛xyz1⎠
⎞=⎝
⎛znxzny?1⎠
⎞…………①
-
这个点在齐次坐标下,所有分量同时×Z,表示的是同一个点,即
(
n
z
x
n
z
y
?
1
)
=
(
n
x
n
y
?
z
)
\\Large\\begin{pmatrix}\\frac{n}{z}x\\\\\\frac{n}{z}y\\\\?\\\\1 \\end{pmatrix} = \\begin{pmatrix}nx\\\\ny\\\\?\\\\z\\end{pmatrix}
⎝
⎛znxzny?1⎠
⎞=⎝
⎛nxny?z⎠
⎞
-
然后再带入公式①得到
这个方程就可以得到M矩阵的部分数值了
-
还有一行的数怎么得到?还有两个规则没用
-
(1)近平面上的点不变
对于之前建立的方程,把近平面的点带入(近平面上的点z值为n),做M变换后,依然同×z
目的明确,求M矩阵的第三行,那就直接看n2
只有M矩阵第三行的前两个元素为0,0才可能得到n2所以与xy无关系,未知数只剩下AB
注意n是近平面的z值,是已知的
得到方程1
-
(2)远平面上的点的z值不变
得到方程2:
最终AB算出来为
最后,Squish矩阵 Mpersp->ortho矩阵为
[
n
0
0
0
0
n
0
0
0
0
n
+
f
−
f
n
0
0
1
0
]
\\large \\begin{bmatrix} n&0&0&0 \\\\ 0 & n&0&0 \\\\ 0&0&n+f&-fn\\\\ 0&0&1&0 \\end{bmatrix} \\quad
⎣
⎡n0000n0000n+f100−fn0⎦
⎤
(2)正交投影
透视投影第二步是正交投影,所以需要正交矩阵Mortho(正交矩阵是平移加缩放矩阵组成的)
[
2
r
−
l
0
0
0
0
2
t
−
b
0
0
0
0
2
n
−
f
0
0
0
0
1
]
[
1
0
0
−
r
+
l
2
0
1
0
−
t
+
b
2
0
0
1
−
n
+
f
2
0
0
0
1
]
\\large \\begin{bmatrix} \\frac{2}{r-l}&0&0&0 \\\\ 0 & \\frac{2}{t-b}&0&0 \\\\ 0&0&\\frac{2}{n-f}&0\\\\ 0&0&0&1 \\end{bmatrix} \\large \\begin{bmatrix} 1&0&0&-\\frac{r+l}{2} \\\\ 0 &1&0&-\\frac{t+b}{2} \\\\ 0&0&1&-\\frac{n+f}{2}\\\\ 0&0&0&1 \\end{bmatrix}
⎣
⎡r−l20000t−b20000n−f200001⎦
⎤⎣
⎡100001000010−2r+l−2t+b−2n+f1⎦
⎤
最终Mpersp 为上面三个矩阵的乘积
M
p
e
r
s
p
=
M
o
r
t
h
o
⋅
M
p
e
r
s
p
→
o
r
t
h
o
=
[
2
n
r
−
l
0
l
+
r
l
−
r
0
0
2
n
t
−
b
b
+
t
b
−
t
0
0
0
n
+
f
n
−
f
−
2
n
f
n
−
f
0
0
1
0
]
M_{persp} = M_{ortho}·M_{persp\\to ortho}=\\Large\\color{red} \\begin{bmatrix} \\frac{2n}{r-l}&0&\\frac{l+r}{l-r}&0 \\\\ 0 & \\frac{2n}{t-b}&\\frac{b+t}{b-t}&0 \\\\ 0&0&\\frac{n+f}{n-f}&\\frac{-2nf}{n-f}\\\\ 0&0&1&0 \\end{bmatrix} \\quad
Mpersp=Mortho⋅Mpersp→ortho=⎣
⎡r−l2n0000t−b2n00l−rl+rb−tb+tn−fn+f100n−f−2nf0⎦
⎤
-
叠加正交投影得到透视投影矩阵,Mortho是前面正交投影矩阵算出来的,先位移后缩放那个,所以这Mpersp是三个矩阵叠加
-
由于透视投影的第二步实际上是正交投影,所以最终也会到[-1,1]3盒子中
暂无评论内容