渲染流水线
一般分为三个阶段:应用阶段、几何阶段和光栅化阶段
应用阶段:单位为渲染图元,在CPU上进行
应用阶段分为三个阶段:
(1)准备哪些对象被渲染,哪些被剔除,然后将要渲染的对象从硬盘加载到内存,然后数据再加载到显存中 ,HDD(硬盘)->RAM(内存)->VRAM(显存)
(2)设置渲染状态,也就是设置对象所需的材质,纹理,着色器等。
(3)输出渲染图元,调用Draw Call,并将渲染图元传递给gpu
几何阶段:GPU上进行
几何阶段里面包括:
顶点着色器(把顶点坐标从模型空间转换到齐次裁剪空间),主要对cpu输出的渲染图元进行顶点空间几何变化以及顶点光照着色处理等。
曲面细分着色器,主要用来细分图元
几何着色器,主要用来逐个图元的着色操作,或者产生更多的图元。
裁剪,主要是对不在相机视野内的顶点进行裁剪,并剔除一些三角形图元面片。
屏幕映射(注意OpenGL左下角是(0,0) DirectX左上是(0,0)),主要负责将图元立方体坐标映射到屏幕坐标系中。
光栅化阶段:GPU上进行
光栅化阶段里面包括:
三角形设置,主要对几何阶段输出的屏幕坐标系中的顶点数据进行计算,获取光栅化网格所需要的数据信息的过程。
三角形遍历(生成片元,也称扫描变换),主要是对网格覆盖的每一个像素生成一个片元,并且片元的状态主要由像素插值进行计算获取。
片元着色器(可编程着色器阶段),主要对生成的片元进行处理输出一个或者多个像素。
逐片元操作(纹理采集 1.决定片元可见性 2.合并(片元->模板测试->深度测试->混合->颜色缓冲区))
gpu将最终的像素缓冲区的像素颜色放入到后缓冲区进行绘制,绘制完毕后就和前缓冲区交换并刷新显示到屏幕上。
注意:
CPU和GPU并行工作,用的是命令缓冲区。
减少DrawCall方法:批处理(1.避免使用大量很小的网格 2.避免使用过多的材质)
以上每一个渲染流程中的步骤在不同的图像编程接口(CG/HLSL/GLSL)以及gpu上可能会有所不同。
光栅化的逐片元操作中的可见性测试是十分耗时的过程,而且一旦测试不通过,之前做的所有操作都是白费,这样是十分浪费性能的做法,所以可以采用Early-z技术,也就是将可见性测试提到片元着色器的前面,一旦不通过直接舍弃而不至于浪费片元着色器操作时间,提高渲染速度。