vulkan变换与坐标系(翻译)
概述
在光栅化过程之前,顶点位置和法线向量等几何数据通过Rasterization Pipeline顶点操作和图元操作进行变换
- 顶点操作包括模型变换、视图变换、投影变换
- 图元操作包括将点组成的图元、剔除、裁剪、屏幕投影
模型矩阵
输入没有经过任何的变换顶点数据是物体的局部坐标,经过模型矩阵变换后,将物体从模型空间坐标转化为世界空间的坐标,矩阵中可以包含平移、缩放、旋转等变换
平移矩阵
等号左边表示为顶点的齐次坐标(x,y,z,1),是将等号右边的4*4矩阵为平移矩阵,是将(x0,y0,z0,1)进行平移变换,平移(dx,dy,dz,0)
缩放矩阵
等号左边表示为顶点的齐次坐标(x,y,z,1),是将等号右边的4*4矩阵为缩放矩阵,是将(x0,y0,z0,1)进行缩放变换
旋转矩阵
绕x轴旋转α角
绕y轴旋转β角
绕z轴旋转γ角
旋转矩阵公式推导步骤:
绕z轴旋转y角,z的坐标不变,x、y坐标发生变化假设原始点位置为:
将这个点绕z轴旋转γ角,所以z坐标不变,x,y坐标改变,旋转后点坐标为
旋转后点的坐标为
将方程组的等效矩阵为:
观察矩阵
确定一个观察位置,然后将模型位置从世界坐标转化到观察位置,这个矩阵确定了相机位置,以及相机的上方向。相机位置很容易理解就是观察者的位置,其他物体的坐标会根据观察者的位置的改变而相应做出改变,相机的上方向即是确定了相机的倾斜角度,类似于屏幕,相机可以是水平可以竖直可以倾斜任意角度,所以需要确定一个相机的上方向,保证观察的角度不会倾斜倒置
投影矩阵
是将3D场景变换为2D场景,以便于在计算机屏幕上显示。投影矩阵就用于此投影变换,首先,它将所有的顶点数据从相对于观察者的坐标转化为裁剪坐标,然后通过除以裁剪坐标的w分量,将这些裁剪坐标转化为ndc坐标(Normalized Device Coordinates)。
因此,我们必须记住,裁剪(视锥剔除)和NDC变化都集成到了投影矩阵中,在模型矩阵中,定义了视锥体的上下左右边界,所以裁剪剔除和ndc的变换都集成到了投影矩阵中
在透视投影中,视锥体中的3D坐标被映射到立方体中,这时的坐标为ndc,x、y的坐标范围分别从[l,r] [t,b]映射到[-1,1] [-1,1],在vulkan中观察矩阵为左手系,上面左图坐标系错误,ndc坐标为右手系,上面右边立方体的坐标系错误,图中为左手系
在vulkan中,观察空间中的3D点被投影到投影平面上,下面显示了观察空间中的点(xe,ye,ze)是如何投影到投影平面上的(xp,yp,zp)
左图是视锥体的俯视图,将观察空间中的x坐标xe映射到xp,通过相似三角形计算:
右图为视锥体的右视图,将观察空间中的y坐标ye映射到ye,通过相似三角形计算:
其中xp和yp都依赖于ze,它们与ze成反比,所以这是构造投影矩阵的第一个线索,通过乘以投影矩阵对观察坐标进行变换后,裁剪坐标仍然是一个齐次坐标,它最终通过除以裁剪坐标的w分量来变为ndc
因此,我们可以将裁剪坐标的w分量设置为ze,这样,模型矩阵的第四行就变成了(0,0,1,0)
接着,我们将xp和yp映射到NDC的xn和yn,具有线性关系;[l,r]=>[-1,1]和[t,b]=>[-1,1]
上式满足当xp=r时,xn=1,所以代入上式可得:
移项可得:
所以将(8)式结论带入(6)式中可得
上式满足当yp=b时,yn=1,带入上式可得:
移项可得:
将(12)带入(10)中可得:
然后,我们将(1)带入(9)中可得:
将结果结合(4)中的
可得
将(2)带入(13)中可得:
将结果结合(4)中的
可得
根据(16)和(18)可的矩阵的部分:
现在还剩下最后投影矩阵的第三行,由于对投影到ndc坐标的一个点可以对应从观察者坐标到投影点连线的延长线上的任意一点,所以可以知道zclip和zeye的关系与点x、y坐标无关,所以填充公式(19)中的(3,0)(3,1)位置并设(3,2)(3,3)位置的变量为A和B
结合(4)中的
在观察空间中,weye=1,因此方程变为:
我们带入特殊值,将(n,-1)和(f,1)带入(zeye,zndc)中
化简得:
对于方程式(23)其中的f和n时常数,所以其中的变量为AB,解方程组可得:
将A,B带入(19)中可得投影矩阵为:
这个投影矩阵适用于任意形状的截头视锥体投影在原点在投影矩形的任意位置,当原点在投影平面的任意位置时,类似于枪战游戏中枪口指针肯定会在屏幕的中心,即r=-l b=-t,则投影矩阵可以简化为:
其中r就为屏幕的宽度一半,b为屏幕高度的一半,即:
视口变化
将ndc转化为屏幕上显示的坐标,以便画面在屏幕上显示,此时窗口坐标仍保留着z坐标,z坐标的作用是在fragment shader中进行深度测试
上面左图为opengl,是左手系,在vulkan中ndc坐标为右手系,左图的y轴正方向朝下为vulkan坐标系,所以坐标点应该变化,在vulkan中输入数据有窗口的高度宽度以及深度范围,深度范围默认是(0.0f,1.0f)
当坐标由ndc(xndc,yndc,zndc)至窗口坐标(xwindows,ywindows,zwindows)
由上图可知,取特殊值,当xndc=-1时,xwindows=x,将值带入(24)式得
化简(25)可得
将(26)带入(24)式可得
同理对于y方向来说
取特殊值,当yndc=1时,ywindows=y,将值带入(28)式得
化简(29)可得
将(30)带入(28)可得
同理对于z方向
取特殊值,当zndc=1时,zwindows=F,将值带入(28)式得
化简(33)可得
将(34)带入(32)中可得
结合(27)(31)(35)式可得
这个方程组得等效矩阵为