Unity Shader数学基础——坐标空间

坐标空间的变换

在渲染流水线中,我们往往需要把一个点或者方向矢量从一个坐标空间转换到另一个坐标空间。

要想定义一个坐标空间,必须指明其原点位置和三个坐标轴的方向。而这些数值实际上是相对于另一个坐标空间的。也就是说,坐标空间会形成一个层次结构——每个坐标空间都是另一个坐标空间的子空间,反过来说,每个空间都有一个父坐标空间。对坐标空间的变换实际上就是在父坐标空间和子空间之间对点和矢量进行变换。

当给定一个坐标空间以及其中一个点(a,b,c)时我们是如何知道该点的位置的呢?我们可以通过4个步骤来确定它的位置:

  1. 从坐标空间的原点开始;
  2. 向x轴方向移动a个单位;
  3. 向y轴方向移动b个单位;
  4. 向z轴方向移动c个单位;

模型空间

模型空间,是和某个模型或者说是对象有关的。模型空间有时候也被称为对象空间或局部空间。每个模型空间都有自己独特的坐标空间,当他移动或者旋转的时候,模型空间也会跟着她移动和旋转。

在模型空间中,我们经常使用一些方向概念,例如,前(forward)后(back)左(left)右(right)上(up)下(down)。我们将这些方向称之为自然方向。模型空间中的坐标通常使用这些自然方向。

模型空间的原点和坐标通常是由美术人员在建模软件里确定好的。当导入Unity中后,我们可以在顶点着色器中进行访问到模型顶点信息,其中包含了每个顶点的坐标。坐标都是相对于模型空间中的原点定义的。

世界空间

世界空间是一个特殊的坐标系,因为他建立了我们关心的最大的空间。空间是可以无限大的,这里最大只是一个宏观的概念,也就是说它是我们说关心的最外层的坐标空间。

世界空间可以被用于描述绝对位置,绝对位置指的就是在世界坐标系中的位置。

在Unity中世界空间使用的是左右坐标系。但是他的x轴y轴z轴是固定不变的。在Unity中,我们可以通过调整Transform组件中昂的Position属性来改变模型的位置,这里的位置值是相对于Transform的父节点的模型坐标空间中的原点定义的。如果一个Transform没有任何父节点,那么这个位置就是在世界坐标系中的位置。

顶点变换的第一步,就是将顶点坐标从模型空间转换到世界空间中。这个变换通常叫做模型变换。

观察空间

观察空间也被成为摄像机空间。观察空间可以认为是模型空间的一个特例——所有的模型空间中有一个非常特殊的模型,即摄像机,它的模型空间值得我们单独来讨论,也就是观察空间。

摄像机决定了我们渲染游戏所使用的的视角。在观察空间中,摄像机位于原点,同样,其坐标轴的选择可以是任意的。

观察空间和屏幕空间是不同的。观察空间是一个三维空间,而屏幕空间是一个二维空间。从观察空间到屏幕空间需要经过一个操作,那就是投影。

顶点变换的第二步,就是将顶点坐标从世界坐标换到观察空间中。

裁剪空间

顶点接下来要从观察空间转换到裁剪空间,这个用于变换的矩阵叫做裁剪矩阵,也被称为投影矩阵。

裁剪空间的目标就是能够方便的对渲染图元进行裁剪:完全位于这块空间内部的图元将会被保留,完全位于这这块空间外的图元将会被剔除,而与这块空间边界相交的图元就会被裁剪。那么,这块空间是如何决定的呢?答案是由视锥体来决定的。

视锥体是指空间中的一块区域,这块区域决定了相机可以看到的空间。视锥体由六个平面包围而成,这些平面也被称为裁剪平面。视锥体有两种类型,这设计两种投影类型:一种是正交投用,一种是透视投影。

在视锥体的6块平面中,有两块裁剪平面是比较特殊,他们分别称之为近裁剪平面和远裁剪平面。他们决定了摄像机可以看到的深度范围。

屏幕空间

经过投影矩阵变换后,我们可以进行裁剪操作。当完成了所有的裁剪工作后,就需要进行真正的投影了,也就是说,我们需要把视锥体投影到屏幕空间中。经过这一步变换,我们会得到真正的像素位置。

屏幕空间是一个二维空间,我们必须把顶点从裁剪空间投影到屏幕空间中,来生成对应的2D坐标。 

总结

以上就是顶点如何从模型空间转到屏幕空间的过程,顶点着色器的最基本的任务就是把顶点坐标从模型空间转换到裁剪空间。而片元着色器中我们通常也可以得到该片元在屏幕空间的像素位置。

猜你喜欢

转载自blog.csdn.net/f402455894/article/details/122583265