个人学习中的理解,由于水平有限,还是学习笔记,如果有大佬发现错误或者偏差,还请帮我纠正一下.感谢
深度测试与渲染队列
坐标系与坐标空间
-
坐标系
坐标系是用一个或多个数字来表示一个坐标,用来定义一个元素位置的系统.诸如 笛卡尔坐标系 这是2d世界中经常使用到的一种坐标系,是由一组互相垂直的直线定义两个方向(通常以垂直交点为原点,水平向右为X轴正方向,竖直向上为Y轴正方向),通过这两个轴向上的分量来描述元素的位置.
在计算机图形学中,为了方便计算,经常还是使用到 齐次坐标系 简单的说,这就是对原始坐标系的一个升维处理,在原本坐标系的最后添加了一个新的维度,这个维度更有利于帮助我们利用矩阵来计算坐标的平移操作.比如2d坐标(x,y)的齐次坐标就是(x,y,w),3d坐标(x,y,z)的齐次坐标就是(x,y,z,w).
对于这个w,会根据这组值所表达的意义不一样而富于不一样的值,当w = 1时,表示该组值表示的是一个点(point),当w=0时,表示该组值表示的是一个向量(vector).这样做的目的是为了保持向量(vector)的平移不变性.
向量(Vector)<x1,y1,z1,0> + 向量(vector)<x2,y2,z2,0> = 向量(vector)(x1+x2,y1+y2,z1+z2,0+0)
点(point)<x1,y1,z1,1> + 向量(vector)<x2,y2,z2,0> = 点(point)(x1+x2,y1+y2,z1+z2,1+0)
点(point)<x1,y1,z1,1> - 点(point)<x2,y2,z2,1> = 向量(vector)(x1-x2,y1-y2,z1-z2,1 - 1)
点(point)<x1,y1,z1,1> + 点(point)<x2,y2,z2,1> = 点(point)((x1+x2)/(1 + 1),(y1+y2)/(1 +1),(z1+z2)/(1 + 1),(1 + 1)/(1 + 1)) 额外定义,表示两个点的中点
这种使用方法是一中特殊的使用方式,是渲染流水管线对于向量或者法线的一个说明,因为对于向量我法线我们并不需要对其进行平移的操作.所以给他给定一个0的标定.
-
坐标空间
通过一个确定的坐标系,来描述不同元素之间的相互位置关系.确立一个明确的空间体系.根据不同的用途,在图形学中划分出了如 局部(物体)坐标空间, 世界坐标空间, 摄像机(观察)坐标空间, 投影坐标空间, 视口坐标空间
1. 局部(物体)坐标空间
为了创建物体的外形,方便记录顶点的位置信息儿创建出来的坐标系,是相对物体自身来说的,个人理解就是为了方便鼻子眼睛不跑偏而存在.
局部坐标
x
世界坐标变换矩阵
2. 世界坐标空间
相对于局部坐标系的存在,为了能让更多的模型参与其中,构建出更宏大,复杂的场景等儿存在的.世界坐标系的存在,可以方便我们完成对物体位置,大小,朝向的定义.让我们可以将各种物体放置融合到一起,构建一个完成的世界.
在计算过程中,需要使用 (局部坐标) x [世界变化矩阵] 将坐标从局部坐标系转换到世界坐标系中,通常在这个转换中包含了 平移,旋转,缩放的 操作.
世界坐标
x
摄像机坐标变换矩阵
3. 摄像机(观察)坐标空间
在构建出完整的世界以后,就需要考虑从什么地方看的问题.这个摄像机(观察)坐标系也就应运而生.因为观察位置,观察方向的不同,这个坐标系可能和世界坐标系重合,但大多时候都不会有这种巧合.
在计算过程中,需要使用 (世界坐标) x [摄像机变化矩阵] 将坐标从世界坐标转换到摄像机坐标系中,这一步的操作是对于整个世界中的物体来说的.相当于是将整个世界根据摄像机的位置和朝向,整体进行了 平移,旋转的操作.
摄像机坐标
x
投影坐标变换矩阵
4. 投影坐标空间
经过上述变换,虽然已经有了名为摄像机的摄像机矩阵参与其中,但是计算出来的结果依旧不是人眼观察世界的结果,为了达成符合人眼观察世界的结果,根据人眼视网膜投影的原理,引入了投影坐标系的概念.
在计算过程中,需要使用##160;$#160;(摄像机坐标) x [投影坐标矩阵] 将坐标从摄像机坐标系转换到投影坐标系中,这一步操作就好像是在摄像机前方放了一个幕布,将所有顶点都根据一定的规则,映射到了这个幕布中.与老式摄像机的胶片类似,把所有的物体都采集到这个无比巨大的胶片上.
投影坐标
x
视口坐标变换矩阵
5. 视口(屏幕)坐标空间
到了这里我们基本上就是将老式电影胶片中的一个画面,绘制到更大的一个空间中,可以根据外在的显示设备,或者自定义的视窗大小,按一定的规则,将顶点对应到需要绘制的具体位置.
这一步通常是一个缩放的处理.是将计算出来的数据映射到具体的像素中.
6. 可视化判断(大部分在光栅化阶段完成)
经过投影坐标系操作,我们现在将所有的3D物体相当于降维到2D中,我们需要一个无比巨大的胶片承载所有的物体,可是在真实环境中,我们是不可能有无限大的胶片的,所以我们就需要根据一定的规则去判断那些物体可以被看见,哪些物体不能被看见可以舍弃掉(提升计算效率).经过这一步的操作,我们就得到了相当于老式电影的胶片的一格画面的存在.
在这一步操作中通常包含了(视椎体裁剪,背面裁剪,深度(Z)测试,融合等).其中背面裁剪在顶点着色器完成之后,光栅化之前进行,视椎体裁剪在光栅化中完成,深度测试在片元着色器之后完成,融合在深度测试通过之后完成.3D渲染管线流程
PS:总感觉在这个流水管线里,流得不顺畅,留个wiki页,方便后续接着绕.
渲染流水管线