Arzie100 发表于 2022-4-30 16:37

Unity-Shader 02 各种坐标空间的定义

资源与声明:

1-本文章部分图片来源 UCSB 闫令琪 老师《GAMES101 现代计算机图形学入门》
https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html
2-本文章代码来源 冯乐乐老师 《Unity Shader入门精要》
https://github.com/candycat1992/Unity_Shaders_Book/tree/unity_2017_1
3-本文章部分图片与素材来源 知乎 九猫:Shader学习(8)各种坐标空间的定义和变换演示
九猫:Shader学习(8)各种坐标空间的定义和变换演示
4-本文章部分图片与素材来源 博客园 可可西
谈谈法线贴图 - 可可西 - 博客园
// 如有侵权 欢迎联系删除
// 若文章有误,欢迎指正讨论
<hr/>1-模型空间(Object Space)

模型空间(model space)在不同的游戏引擎或者是软件中又称作对象空间(object space)或者局部空间(local space)。
在游戏中的每一个模型或者物体都有各自独立的坐标空间,模型有自己的前后左右,这是它的自身属性,旋转或者是移动和缩放模型并不能改变它的前后左右。
在Unity中,模型空间使用的是左手坐标系,因此在模型空间中,+x轴+y轴+z轴分别对应的是模型的右,上和前向。如下图。



九猫:Shader学习(8)各种坐标空间的定义和变换演示

2-世界空间(World Space)

世界空间是最外层的空间,可以被用于描述绝对位置,这个绝对位置的概念类似于在我们现实世界的经度纬度海拔,
在渲染中,顶点变换的第一步就是把顶点从模型空间转换到世界空间。空间变换的第一步就是要构建变换矩阵。构建变换矩阵其实就是根据子空间原点在父空间中进行的变换来再对顶点进行一次同样的变换。



Transform调整的值也是世界空间

3-观察空间(View Space)

观察空间也叫做摄像机空间(camera space)。观察空间的原点就是摄像机的位置,摄像机在哪里,观察空间原点就在哪里。
观察空间中,原点是摄像机位置,+x轴指向右方,+y轴指向上方,+z轴指向后方。需要注意的是摄像机的前方是-z轴,因为unity中观察空间使用的是右手坐标系,模型空间和世界空间使用的是左手坐标系,这个只需要记住就行了。
在渲染流程中,顶点变换的第二步就是把顶点从世界空间变换到观察空间中,这个变换叫做观察变换(view transform) 是MVP变化里的V过程
相机和物体的运动方向和速度是相同的,我们可以说他们是相对静止的。
于是我们约定俗称 假设相机是静止不动的方向永远朝向-z方向,up是Y方向
所有的物体都可以乘上一个变化矩阵来保持和相机的相对静止;



《GAMES101 现代计算机图形学入门》



由平移和旋转组成的变化矩阵《GAMES101 现代计算机图形学入门》

4-裁剪空间(Clip Space)

其实就是描述了一个投影范围;范围之外的会被裁剪掉;





透视/平行空间《GAMES101 现代计算机图形学入门》

视锥体的六个平面当中,上下左右四个平面相当于望远镜的镜筒,而近裁剪平面和远裁剪平面则决定了你可以看到的最近和最远的距离。所有位于视锥体之内的物体将会被渲染,否则就会被裁剪而不能进入下一个环节。
正交投影的视锥体是一个长方体,而透视投影的视锥体是一个四棱锥,对于透视投影,要想判断顶点是否在一个锥体中是比较麻烦的,所以我们需要先通过一个投影矩阵把顶点转换到一个裁剪空间中。
任何不满足上述条件的顶点将会被裁剪掉。现在A点的w分量为3.214,很明显不满足条件,所以被裁剪掉了。在Unity中显示的效果如下:



九猫:Shader学习(8)各种坐标空间的定义和变换演示

5-屏幕空间(Screen Space)

这一步就到了对一个顶点进行变换的最后一步,求出顶点在屏幕上的最终位置,也就是把视锥体投影到屏幕空间。
屏幕空间是一个二维空间,所以我们需要把顶点用齐次除法(homogeneous division)也叫透视除法(perspective division)来把顶点从裁剪空间投影到屏幕空间中。
齐次除法就是就是用齐次坐标系的w分量去除以x、y、z分量。裁剪空间在经过齐次除法之后,会变换到一个立方体内。



九猫:Shader学习(8)各种坐标空间的定义和变换演示



《GAMES101 现代计算机图形学入门》



《GAMES101 现代计算机图形学入门》

有一个绝妙的思想,透视投影 和 水平投影的差别
可以理解先把透视投影的 f 宽的那一面 挤压到和 n 那一面一样大
然后 就是一个水平投影就完事了。
挤压的过程中 有三个不变:(得到的是一个唯一的解法)
1-近平面n 不发生变化
2-f面的z坐标也不发生变化
3-f面的假设中心点 也不发生变化



《GAMES101 现代计算机图形学入门》

这里有一个相似三角形,就是 每一个坐标 都给乘一个 n/z 的比例


可以这么理解 给挤压之后的任意一个点 每个项×一个z 就还是这个点
其实中间项的unknown 也是n


所以 我们就知道 第一个项 经过一个变化矩阵 得到第三个项,就可以求变化矩阵。




这样就可以解出 四行中的三行
我们就去找两个z不变的平面;
但是 z是不变的!近平面的是 x y n 1 远的平面是 x' y' z 1
这两个条件可以求第三行




接下来就来推导第三行:
先看近平面:



《GAMES101 现代计算机图形学入门》

再看远平面;




summary:
这样! 怎么推导第三行呢
Step01


Step02


step03
解方程组 得到AB


接下来一步就是正交投影就好了!
这个就是屏幕空间;
6-切线空间(Tangent Space)

对于模型的每个顶点,它都有一个属于自己的切线空间,这个切线空间的原点就是该顶点本身,而z轴是顶点的法线方向(n), x轴是顶点的切线方向(t),而y轴可由法线和切线叉积而得,也被称为是副切线(bitangent, b)或副法线。使用切线空间可以重用法线纹理,所以应用很广。



T为u方向,N为u和v的叉乘,B为N和T的叉乘--谈谈法线贴图 - 可可西 - 博客园

其中,原点对应顶点坐标,x轴是切线方向(T),y轴是副切线方向(B),z轴是法线方向(N)



UE4中StaticMesh的Normals、Tangents、Binormals:谈谈法线贴图 - 可可西 - 博客园

切线空间(Tangent Space) 使用比较多的场景是材质的凹凸贴图;下期会详细分解;
//Thanks
页: [1]
查看完整版本: Unity-Shader 02 各种坐标空间的定义