渲染流水线的工作任务是:将三维场景里的物体投到屏幕上,生成一张二维图像。 可分为三个阶段:应用阶段、几何阶段、光栅化阶段。
该阶段最重要的输出是渲染图元,如:点、线、三角面等,会被传递到下一个有GPU负责的阶段——几何阶段。
应用阶段的三个阶段:
GPU从CPU那里拿到顶点数据后,经过几何阶段和光栅化阶段将场景里的物体绘制到屏幕中。
我们需要重点关注的是顶点着色器(Vertex Shader)和片元着色器(Fragment Shader)。
顶点着色器需要完成工作主要有:坐标转换和逐顶点光照。
坐标转换,将模型的顶点坐标从模型空间转换到其次裁剪空间。
需要注意: OpenGL中NDC的z分量范围是[-1, 1] DirectX中NDC的z分量范围是[0, 1]
NDC,全称Normalized Device Coordinates,归一化的设备坐标。(后续会详细了解)
一个图元和摄像机视野的关系有3种:
屏幕映射前,顶点的坐标仍然在三维坐标系下,屏幕映射的任务是将每个图元的x、y坐标转换到屏幕坐标系下。 屏幕坐标系和z坐标一起构成了窗口坐标系。
屏幕坐标系在OpenGL和DirectX之间的差异:
光栅化的第一个流水线阶段。 光栅化两个最重要的目标:
三角形设置是一个计算三角形网格表示数据的过程,提供三角形边界的表示方式,为下阶段三角形遍历做准备。
遍历判断每个像素是否被一个三角网格覆盖,若覆盖,则生成一个片元(fragment),这个过程也叫扫描变换。片元的信息数据通过三个顶点差值得到。
DirectX中也被称为像素着色器(Pixel Shader)。 片元着色器的输入是顶点着色器的输出差值得到的结果,片元着色器的输出是一个或多个颜色值。
OpenGL里称为逐片元操作,DirectX中称为输出合并阶段。这个阶段有几个主要任务:
深度测试、模板测试的简化流程图:
有些GPU为了提高性能,将深度测试放到片元着色器之前处理,这种技术称为Early-Z技术。
经过上述流程,颜色缓冲区中的颜色值被显示到屏幕上,但是为了防止正在进行光栅化的图元被显示在屏幕上,GPU采取了 双重缓冲(Double Buffering) 的策略,所以对场景的渲染是发生在幕后的,即: 后置缓冲(Back Buffer) 中。
Shader本质就是运行在GPU流水线上的可高度编程的代码,主要有:顶点着色器(Vertex Shader)、片元着色器(Fragment Shader),今后的开发学习中也主要是和这两个着色器打交道。