渲染流水线:
概念阶段:应用阶段(输出渲染图元,CPU)->几何阶段(输出屏幕坐标的顶点信息,GPU)->光栅化阶段(GPU)
应用阶段:(1) 数据加载到显存(HDD->RAM->VRAM)
(2)设置渲染状态(如何被渲染)
(3)DRAW CALL CPU向GPU发送的命令,仅仅指向需要被渲染的图元队列,不会包含材质信息(上一步已经完成)
几何阶段:(1)顶点着色器:完全可编程,对于顶点的空间变换和着色。必须的是把顶点从模型空间转化到其次裁剪空间(之后再由硬件做透视除法转化为NDC),
(2)曲面细分着色器:可选着色器,用于细分图元
(3)几何着色器:可选着色器,逐图元着色操作或者是生成更多图元
(4)裁剪:可配置,剔除视野外的区域。分三种,不在视野中,完全在视野中,部分在视野中。对于部分在视野中的,需要重新构建顶点进行裁剪。
(5)屏幕映射:不可变成,把图片映射到屏幕。(注意OpenGL和DirectX的屏幕坐标系的差异)
光栅化阶段:(1)三角形设置。确定每个图元。
(2)三角形遍历(扫描变换)。检查像素是否被三角形覆盖,被判定覆盖就生成一个片元,对于其中的信息进行插值处理。输出的片元序列。(片元不是像素,片元只是状态集合,比如深度信息,坐标,法线,纹理等等用于计算颜色的元素)
(3)片元着色器。输出一个或者多个颜色值。可以完成纹理采样技术。限制是只能影响自己这个片元。
(4)逐片元操作(合并输出阶段)。首先对于片元进行模板测试,深度测试,然后把目前颜色和目标颜色进行混合(看是否开启了混合),写入颜色缓冲区。Early-Z,在片元着色器之前进行深度测试,这样可以提高GPU性能。但是如果进行透明度测试,如果被Clip函数舍弃了这个像素,那么无法提前进行这些测试,这就产生冲突,就需要GPU对于像素进行判断该,这样就会加大性能消耗。 为了避免我们能够看到正在进行光栅化的图元,,GPU采用了双重缓冲
Draw Call:CPU调用图像编程接口。
CPU和GPU通过命令缓冲区进行并行工作
Draw Call 多了会影响帧率的原因是因为需要做很多的重复操作,比如拿,写等。
如何优化:使用批处理,但是得注意批处理需要用同一种材质。