渲染管线概述
渲染管线简介¶
渲染管线的主要功能是决定在给定虚拟相机、三维物体、光源、照明模式,以及纹理等诸多条件的情况下,生成或绘制一幅二维图像的过程。
主要可分为三个阶段
阶段 | 说明 |
---|---|
应用程序阶段 | 通过软件的方式实现某些操作(如碰撞检测),将需要在屏幕上绘制的几何体传输到GPU渲染管线当中,以此优化渲染性能 |
几何阶段 | 进行逐顶点、逐多边形的操作,包括MVP变换、裁剪、屏幕映射等操作。这阶段会输出每个顶点的屏幕坐标、深度值以及与着色有关的信息 |
光栅化阶段 | 对屏幕坐标上的图元进行光栅化,转成像素;再逐像素进行着色器;最后进行混合等操作 |
应用程序阶段¶
应用程序阶段发生在CPU当中,它的目的在于将需要渲染的数据传输给GPU、控制GPU完成渲染流程。因此,实际上就是要完成CPU与GPU之间的通信。
应用程序阶段大致也可分为三个阶段
应用程序阶段 | 说明 |
---|---|
把数据加载到显存当中 | 1. 渲染数据可能来自硬盘或网络,需要将它们加载到系统内存(RAM)当中 2. 为提高性能,可以做一些粗粒度的剔除操作,把不可见的物体剔除,可见的物体才传输到显存当中(还可做一些其他操作优化效率,如LOD调度) |
设置渲染状态 | 告诉GPU,数据应该如何被渲染,例如使用哪个顶点、片元着色器,光源属性、材质是什么(在同一份渲染状态,不同网格渲染出来的外观是一样的) |
调用Draw Call | 给GPU发送指令,通知它渲染哪个网格 |
- 把数据加载到显存当中
- 设置渲染状态
- 调用Draw Call
GPU渲染管线¶
除了应用程序阶段在CPU上执行外,剩下的几何阶段与光栅化阶段都在GPU中执行,因此也把它俩合起来称为GPU渲染管线。
与应用程序阶段所不同的是,开发者对GPU渲染管线无法拥有绝对的控制权
- 绿色:可编程。开发者可编写着色器程序,通过着色器程序来控制此阶段
- 黄色:可配置。开发者可通过一些指令控制此阶段的一些操作
- 蓝色:固定阶段。开发者无法控制这两个阶段,行为都是GPU固定的
输入、阶段、输出 | 说明 |
---|---|
顶点数据 | 由应用程序阶段传输到显存中,并由DrawCall指定,再传输到顶点着色器当中 |
顶点着色器 | 逐顶点处理,通常实现MVP变换(模型坐标转到齐次裁剪空间) |
曲面细分着色器 | 可选阶段。用于细分图元 |
几何着色器 | 可选阶段。逐图元操作、或被用于产生更多图元,即能够高效地创建和销毁顶点 |
裁剪 | 对与视锥相交的三角形进行裁剪。此阶段是可配置的,例如 1. 使用自定义裁剪平面来配置裁剪区域 2. 通过指令控制裁剪三角图元的正面还是背面 |
屏幕映射 | 将图元的顶点坐标转换到屏幕坐标系中 |
三角形设置 | 计算三角形表面的差异和其他相关数据 |
三角形遍历 | 遍历三角形内所有的像素 |
片元着色器 | 逐像素调用片元着色器,可以在片元着色器里完成一些计算,如计算复杂的着色方程 |
合并阶段 | 对每个片元结果进行合并,涉及的操作有:模板缓冲、Z缓冲、颜色混合等等 |
附:GPU渲染管线有两种模式¶
早期的渲染管线采用的是立即渲染模式(Immediate mode,也就是固定渲染管线),它不允许开发人员改变GPU渲染的方式。
核心渲染默认(Core-profile mode)允许开发人员定制化GPU的渲染方式,上文讨论的都是这种模式
参考文章¶
- 《Unity Shader入门精要》