大致可以分为三个阶段:
一、应用阶段
1.将数据由CPU加载到显存(VRAM)
2.设置渲染状态(选用怎样的顶点着色器或片元着色器等)
3.调用DrawCall
(下面开始就是GPU的渲染过程了)
二、几何阶段
几何阶段的主要目的是完成坐标变化并输出为归一化的设备坐标(当然还可以做顶点着色)
1.顶点着色器:可编程。操作顶点,进行mvp变换,最终输出的是投影裁剪空间下的顶点坐标(Projection And Clip)
2.GPU做透视除法(也叫屏幕映射),将顶点左边转化为NDC(normalize device coordinate)归一化的设备坐标(顶点范围在[-1,1])
三、光栅化阶段
光栅化阶段的目的有两个:计算每个图元覆盖了哪些像素 ,为这些像素计算他们的颜色
1.三角形设置:计算光栅化一个三角网格所需要的信息。前面得到了每个三角顶点的信息,但是还未得到三角形每条边上的像素坐标信息,计算三角形每个边上的像素坐标信息的过程就称为三角形设置。
2.三角形遍历:这个阶段会检查每个像素是否被一个三角形所覆盖,被覆盖的话就形成一个片元。片元中各个像素点的数据是又顶点数据进行插值得到的
3.片元着色器:它的输入是上一个阶段对顶点信息插值得到的结果,更具体来说,是根据那些从顶点着色器输出的数据插值得到的。而它的输出是一个或者多个颜色值。
4.逐片元操作:逐片元操作(Per-Fragment Operations)是OpenGL中的说法,在DirectX中,这一阶段被称为输出合并阶段(Output-Merger)
主要任务:
(1)决定每个片元的可见性。这涉及了很多测试工作,例如深度测试、模板测试等。
(2)如果一个片元通过了所有的测试,就需要把这个片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并,或者说是混合。
(现在很多GPU会在片元着色之前就进行测试,提高效率)
5.加载到帧缓存,显示图像