什么是渲染流水线?
渲染流水线的目的:有一个三维场景出发、生成(或者说渲染) 一张二维图像。
各个工作通常由CPU和GPU共同完成
渲染流程可以分为三个阶段:应用阶段(Application Stage)、几何阶段(Geometry Stage)、光栅化阶段(Rasterizer Stage)
注意这里是概念阶段,每个概念阶段包含了子流水线阶段。它是为了给一个渲染流程进行基本的功能划分而提出来的。
应用阶段
该阶段由CPU负责实现,由开发者主导
任务:
1.准备好场景数据(摄像机的位置、视锥体、场景中包含了哪些模型、使用了哪些模型等)
2.为了提高渲染性能,做粗粒度剔除,把不可见物体剔除,不需要再交给几何阶段处理
3.设置好每个模型的渲染状态材质(漫反射颜色、高光反射颜色)、纹理,shader
这一阶段最重要的是输出渲染所需要的几何信息,即渲染图元(点、线、面等),渲染图元传递个几何阶段
几何阶段
用于处理所有和我们要绘制的几何相关的事情。如:绘制的图元是什么?怎样绘制它们?在哪里绘制它们?在GPU运行。
对每个渲染图元逐顶点,逐多边形的操作
任务:
- 把顶点坐标变换到屏幕空间中,再交给光栅器进行处理。
- 通过对输入的渲染图元进行多步处理后,这一阶段将输出屏幕的二维顶点坐标,每个顶点对应的深度值、着色等相关信息,传递给下一阶段
光栅化阶段
产生屏幕像素,渲染最终图像 在GPU运行
任务:
- 决定每个渲染图元中的哪些像素应该被绘制在屏幕上。
- 对上一个阶段得到的顶点数据(纹理坐标、顶点颜色等)进行插值,再进行像素处理
注意:以上三个流水线阶段与GPU流水线不同。这里的流水线均是概念流水线,是为了给渲染流程进行基本的功能划分而提出来的。而GPU流水线,则是硬件上真正用于实现上述概念的流水线。
CPU和GPU之间的通信
渲染流水线的起点是CPU,即应用阶段,应用阶段大致分为三个阶段:
1)把数据加载到显存中
2)设置渲染状态
3)调用Draw Call
把数据加载到显存中
所有渲染所需要的数据都需要从硬盘(HDD)中加载到系统内存(RAM)。然后网格和纹理等数据又被加载到显卡的存储空间——显存(VRAM)。因为显卡对显存的访问速度特别快,而大多数显卡对系统内存是没有直接访问权力。