先了解一下什么是流水线:(下面是百度百科的定义)
流水线:流水线又称为装配线,一种工业上的生产方式,指每一个生产单位只专注处理某一个片段的工作,以提高工作效率及产量
一、什么是渲染流水线
1.概念
渲染流水线的概念与上面说到的流水线的概念也是一致的,其主要任务是输入一个三维场景,然后输出一个二维的图像。这个过程是由CPU
和GPU
一起完成的。
2.渲染流水线的三个阶段
渲染流水线可以分为三个阶段:应用阶段
、几何阶段
、光栅化阶段
a.应用阶段(CPU处理)
这一阶段是由开发者主导的,在这一阶段中开发都有3个主要的任务:
- 首先,需要准备好场景数据(摄相机位置、视锥体、模型和光源等)
- 接着,还需要做粗粒度的剔除工作
- 最后,需要设置好每个模型的渲染状态(使用的材质、使用的纹理、使用的Shader等)
这一阶段最重要的输出是渲染所需的几何信息,即渲染图元,渲染图元可以是点、线、三角面等。
b.几何阶段(GPU处理)
几何阶段主要用于处理所有和我们绘制的几何相关的事情。几何阶段负责和每个渲染图元打交道,进行逐顶点
、逐多边形
的操作。这个阶段可以进一步分成更小的流水线阶段。
几何阶段的一个重要任务就是把顶点坐标变换到屏幕空间中,再交给光栅器进行处理。
总结:输入的渲染图元->屏幕空间的二维顶点坐标、每个顶点对应深度、着色等信息
c.光栅化阶段(GPU处理)
将会使用上一个阶段传递的数据来产生屏幕上的像素,并渲染出最终的图像
。主要任务是决定每个渲染图元中的哪些像素应该被绘制在屏幕上。
3.CPU与GPU之间的通信
渲染流水线的起点是CPU,即应用阶段。应用阶段可以分为下面3个阶段:
- 1.把数据加载到显存中
- 2.设置渲染状态
- 3.调用Draw Call
1.数据加载到显存中
基本步骤就是纹理、网格等数据从硬盘加载到系统内存再加载到显存。数据加载到显存后系统内存中的数据就可以被移除了,但是对于一些数据来说CPU需要访问他们,例如用于碰撞检测用的网格数据,这些数据则会被保留。
2.设置渲染状态
渲染状态指的是场景中的网格是如何被渲染的,例如使用哪个Vertex Shader或者哪个Fragment Shader、光源属性、材质等。