Unity Shader学习笔记:坐标空间

来源:互联网 发布:system01.dbf数据大 编辑:程序博客网 时间:2024/05/23 18:31

已知子坐标系空间C的3个坐标轴在父坐标空间P下的表示Xc,Yc,Zc,以及其原点位置Oc.当给定一个子坐标空间中的一点Ac = (a,b,c).求Ac在父坐标空间下的位置Ap.
解:
1.从坐标空间的原点开始:Oc
2.向X轴方向移动a个单位:Oc + aXc
3.向Y轴方向移动b个单位:Oc + aXc + bYc
4.向Z轴方向移动c个单位 :Oc + aXc + bYc + cZc
则:Ap = Oc + aXc + bYc + cZc
= | | | | | | |a|
| Xc Yc Zc Oc | |b|
| | | | | | |c|
| 0 0 0 1 | |1|

模型空间:
和某个模型或者说对象有关,有时模型空间也被称为对象空间或局部空间。每个模型都有自己独立的坐标空间,当它移动或旋转的时候,模型空间也会跟着它移动和旋转。Unity在模型空间中使用的是左手坐标系,因此在模型空间中,+x轴,+y轴,+z轴分别对应的是模型的右、上和前向。模型空间的原点和坐标轴通常是美术人员在建模软件里确定好的。当导入到Unity中后,我们可以在定点着色器中访问到模型的定点信息,其中包含了每个顶点的坐标。这些坐标都是相对于模型空间中的原点的(通常位于模型的重心)定义的。

世界空间:
一个特殊的坐标系,因为它建立了我们所关系的最大的空间。其中最大指的是我们所关心的最外层的坐标空间。通常我们会把世界空间的原点放置在游戏空间的中心。在Unity中,世界空间同样使用了左手坐标系。但它的x轴,y轴,z轴是固定不变的。在Unity中,我们可以通过调整Transform组件中的Position属性来改变模型的位置,这里的位置指的是相对于这个Transform的父节点的模型坐标空间中的原点定义的。如果一个Transform没有任何父节点,那么这个位置就是在世界坐标系中的位置。

观察空间:
观察空间也被称为摄像机空间。观察空间可以认为是模型空间的一个特例 — 在所有模型中有一个非常特殊的模型,即摄像机。摄像机决定了我们渲染游戏所使用的视角。在观察空间中,摄像机位于原点,同样其坐标轴的选择可以是任意的。Unity在观察空间中使用的是右手坐标系。

裁剪空间:
也称为齐次裁剪空间,这个用于变换的矩阵叫做裁剪矩阵,也被称为投影矩阵。裁剪空间的目标是能够方便地对渲染图元进行裁剪:完全位于这块空间内部的图元将会被保留,完全位于这块空间外部的图元将会被剔除,而与这块空间边界相交的图元就会被裁剪。这块空间就是视椎体。
视椎体:指的是空间中的一块区域,这块区域决定了摄像机可以看到的空间。视椎体由六个平面包围而成,这些平面也被称为裁剪平面。视椎体有两种类型,这涉及两种投影类型:一种是正交投影,一种是透视投影。视椎体类型由其投影类型决定。在视椎体的6块裁剪平面中,有两块裁剪平面比较特殊,它们分别被称为近裁剪平面和远裁剪平面。它们决定了摄像机可以看到的深度范围。

屏幕空间:
经过投影矩阵的变换后,就可以进行裁剪操作。当完成了所有的裁剪工作后,就需要进行真正的投影了,也就是说,我们需要把视椎体投影到屏幕空间中。在Unity中,从裁剪空间到屏幕空间的转换是由底层帮我们完成的。我们的顶点着色器只需要把顶点转换到裁剪空间即可。

//记住这个变换顺序
顶点变换的第一步就是:将顶点坐标从模型空间变换到世界空间中。这个变换通常叫做模型变换。
顶点变换的第二步就是:将顶点坐标从世界空间变换到观察空间中。这个变换通常叫做观察变换。
顶点变换的最后一步就是:将顶点坐标从观察空间变换到裁剪空间中。

法线变换:
法线也称为法矢量。在游戏中,模型的一个顶点往往会携带额外的信息,而顶点法线就是其中一种信息。当我们变换一个模型的时候,不仅需要变换它的顶点,还需要变换顶点法线,以便在后续处理(如片元着色器)中计算光照等。

切线:
切线也被称为切矢量。与法线类似,切线往往也是模型顶点携带的一种信息。它通常与纹理空间对齐,而且与法线方向垂直。