一、渲染流程
1.应用阶段
该阶段由CPU负责实现。开发者有三个主要任务:准备场景数据、 粗粒度剔除(将不可见的物体剔除出去)、设置每个模型的渲染状态(即渲染图元)
2.几何阶段
这阶段在GPU上进行,负责与每个渲染图元打交道,进行逐顶点,逐多边形的操作。该阶段重要任务是将顶点坐标变换到屏幕空间去,再交给光栅器进行处理。该阶段会输出屏幕空间的二维顶点坐标、每个顶点对应的深度值、着色等相关信息。
3.光栅化阶段
该阶段将将上个阶段传来的数据来产生屏幕上的像素,并渲染最终的图像,该阶段也在GPU上进行。光栅化的任务是决定每个渲染图元中哪些像素应该被绘制在屏幕上
二、CPU和GPU之间的通信
1.把数据加载到显存中
所有渲染所需数据需从硬盘加载到系统内存,然后这些数据又被加载到显卡的存储空间。这是因为显卡(GPU)对显存的访问速度更快。在这之后,开发者需要通过CPU来设置渲染状态,指导GPU的渲染工作
2.设置渲染状态
渲染状态即定义场景中的网格如何被渲染,如使用哪个顶点着色器/片元着色器、光源属性、材质等。
3.调用Draw Call
Draw Call是一个命令,由CPU发起,由GPU接收,当定义好一个Draw Call时,GPU会根据渲染状态和所有输入的顶点数据来进行计算,输出成屏幕显示的漂亮像素。
三、GPU流水线
GPU渲染流水线以接收顶点数据作为输入,并将这些数据传给顶点着色器。
1.顶点着色器
顶点着色器是完全可编程的,用于实现顶点的空间变换,顶点着色等功能。
顶点着色器的处理单位是顶点,即输入进来的每个顶点都会调用一次顶点着色器。顶点着色器需要完成的工作有:坐标变换和逐顶点光照
1.1 坐标变换
即对顶点坐标进行某种变换。顶点着色器可以在这一步中改变顶点的位置,即把顶点坐标转换到齐次裁剪坐标系下,接着由硬件做透视除法,最终得到归一化的设备坐标(NDC)
2.裁剪
由于场景可能很大,而摄像机视野范围很可能不会覆盖所有的场景物体,因此需要通过裁剪使不在视野范围内的物体不被处理。
图元和摄像机的关系有3中:完全在视野内、部分在视野内、完全在视野外。对于部分在视野内的图元需要进行的处理就是裁剪。
3.屏幕映射
主要将每个图元的x和y坐标转换到屏幕坐标系,屏幕坐标系是一个二维坐标系,与显示画面的分辨率有关。
屏幕映射不会对z坐标做处理。实际上,屏幕坐标系和z坐标一起构成了个坐标系叫窗口坐标系。这些值会一起被传递到光栅化阶段
4.三角形设置(开始进入光栅化)
光栅化两个最重要目标:1.计算每个图元覆盖了哪些像素 2.为这些像素计算他们的颜色
光栅化第一个阶段为三角形设置,该阶段会计算光栅化一个三角网格所需的信息。
具体来说,上个阶段输出的都是三角网格的顶点,即三角网格每条边的两个端点,若要得到整个三角网格对像素的覆盖情况,这样计算三角网格表示数据的过程就叫做三角形设置
5.三角形遍历
该阶段检查每个像素是否被一个三角网格所覆盖,如果被覆盖则生成一个片元,实际输出得到的是一个片元序列。每个片元包含了很多状态的集合,用于计算每个像素的最终颜色。
6.片元着色器
片元着色器的输入是上个阶段对顶点信息,输出则是一个或多个颜色值。
纹理采样是该阶段最重要的渲染技术之一。
7.逐片元操作
主要任务如下:
(1)决定每个片元的可见性
(2)如果一个片元通过了所有测试,就需要把这个片元的颜色值和已经存储在颜色缓冲区的颜色进行合并
四、固定渲染管线
简称固定管线,通常指在较旧GPU实现渲染流水线,开发者没有对流水线阶段的完全控制权。
固定渲染管线是只可配置的管线,就像我们只可打开或关闭电路上的多个开关,但无法控制整个电路的排布。