【游戏开发3D数学笔记】6.坐标系切换和纹理
程序员文章站
2022-03-26 17:22:02
...
一.物体坐标系到世界坐标系(Model Matrix)
在之前固定流水线,需要将模型的顶点坐标从自身坐标系依次进行缩放,旋转,平移操作(这个顺序不能改变)。而在可编程管线中,这些操作放到了vertex shader中,我们需要得到模型中的每个顶点的世界坐标,从而进行一些深度测试、光照等运算。 而model matrix的推导也十分简单,只需要按照顺序将三种变换的矩阵连乘即可:scale * rotate * translate。 具体推导可以参见: http://blog.csdn.net/silangquan/article/details/50984641 |
二.世界坐标系到相机坐标系(View Matrix)
当经过了Model Transform之后,我们就拿到了物体每个顶点的世界坐标了。但是此时我们为了方便后面的投影、裁剪,需要将顶点的世界坐标转化到摄像机坐标系中。 视图变换(View Transform)就是将坐标轴变为摄像机的up、forward、right。 View Matrix的推导可以参考这边文章 : https://www.cnblogs.com/graphics/archive/2012/07/12/2476413.html |
三.相机坐标系到裁剪空间(Projection Matrix)
经过视图变换后,我们需要将3D的点转化为2D的点,这一步操作就是指投影变换。 投影变换分透视投影、正交投影,两者区别就是前者会进行透视除法,从而形成一种近大远小的视觉感受。 投影变换的矩阵较为复杂,这里不多描述,可以参见:https://www.cnblogs.com/graphics/archive/2012/07/25/2582119.html |
四.裁剪空间到屏幕空间(Screen Matrix)
经过投影变换后,一般来说会进行裁剪、透视除法;此时的坐标已经是NDC(设备坐标标准化),最后我们需要根据需要展现的screen进行转化到屏幕空间。 在这里我们以dx为例,NDC的x,y,z范围为(-1<=x,y<=1,0<=z<=1),所以我们只需要线性映射到 left ~ left + width, top ~ top + height即可。 |
五.变换总结
一般来说,上面三个矩阵是在变换中最常用的矩阵,也称作MVP矩阵。我们也经常会在vertex shader中看到这样的代码: |
gl_Position = projection*view*model*vec4(position,1.0f);
其实上面的代码就是将物体的顶点坐标从物体坐标系转换到裁剪空间。详情可以在这儿查看每个变换的具体实现 Utils工具类 |
六.纹理
纹理主要是用与增添物体细节的一种方式,主要将贴图通过顶点U,V坐标映射到物体身上,给与物体更多的细节。这里,我简单封装了一个纹理Texture2D类,提供读取贴图和采样的接口。Texture2D |