跳转至

渲染管线概述

渲染管线简介

渲染管线的主要功能是决定在给定虚拟相机、三维物体、光源、照明模式,以及纹理等诸多条件的情况下,生成或绘制一幅二维图像的过程。

主要可分为三个阶段

阶段 说明
应用程序阶段 通过软件的方式实现某些操作(如碰撞检测),将需要在屏幕上绘制的几何体传输到GPU渲染管线当中,以此优化渲染性能
几何阶段 进行逐顶点、逐多边形的操作,包括MVP变换、裁剪、屏幕映射等操作。这阶段会输出每个顶点的屏幕坐标、深度值以及与着色有关的信息
光栅化阶段 对屏幕坐标上的图元进行光栅化,转成像素;再逐像素进行着色器;最后进行混合等操作

应用程序阶段

应用程序阶段发生在CPU当中,它的目的在于将需要渲染的数据传输给GPU、控制GPU完成渲染流程。因此,实际上就是要完成CPU与GPU之间的通信。

应用程序阶段大致也可分为三个阶段

应用程序阶段 说明
把数据加载到显存当中 1. 渲染数据可能来自硬盘或网络,需要将它们加载到系统内存(RAM)当中
2. 为提高性能,可以做一些粗粒度的剔除操作,把不可见的物体剔除,可见的物体才传输到显存当中(还可做一些其他操作优化效率,如LOD调度)
设置渲染状态 告诉GPU,数据应该如何被渲染,例如使用哪个顶点、片元着色器,光源属性、材质是什么(在同一份渲染状态,不同网格渲染出来的外观是一样的)
调用Draw Call 给GPU发送指令,通知它渲染哪个网格
  1. 把数据加载到显存当中

  1. 设置渲染状态

  1. 调用Draw Call

GPU渲染管线

除了应用程序阶段在CPU上执行外,剩下的几何阶段与光栅化阶段都在GPU中执行,因此也把它俩合起来称为GPU渲染管线。

与应用程序阶段所不同的是,开发者对GPU渲染管线无法拥有绝对的控制权

  1. 绿色:可编程。开发者可编写着色器程序,通过着色器程序来控制此阶段
  2. 黄色:可配置。开发者可通过一些指令控制此阶段的一些操作
  3. 蓝色:固定阶段。开发者无法控制这两个阶段,行为都是GPU固定的

输入、阶段、输出 说明
顶点数据 由应用程序阶段传输到显存中,并由DrawCall指定,再传输到顶点着色器当中
顶点着色器 逐顶点处理,通常实现MVP变换(模型坐标转到齐次裁剪空间)
曲面细分着色器 可选阶段。用于细分图元
几何着色器 可选阶段。逐图元操作、或被用于产生更多图元,即能够高效地创建和销毁顶点
裁剪 对与视锥相交的三角形进行裁剪。此阶段是可配置的,例如
1. 使用自定义裁剪平面来配置裁剪区域
2. 通过指令控制裁剪三角图元的正面还是背面
屏幕映射 将图元的顶点坐标转换到屏幕坐标系中
三角形设置 计算三角形表面的差异和其他相关数据
三角形遍历 遍历三角形内所有的像素
片元着色器 逐像素调用片元着色器,可以在片元着色器里完成一些计算,如计算复杂的着色方程
合并阶段 对每个片元结果进行合并,涉及的操作有:模板缓冲、Z缓冲、颜色混合等等

附:GPU渲染管线有两种模式

早期的渲染管线采用的是立即渲染模式(Immediate mode,也就是固定渲染管线),它不允许开发人员改变GPU渲染的方式。

核心渲染默认(Core-profile mode)允许开发人员定制化GPU的渲染方式,上文讨论的都是这种模式

参考文章

  1. 《Unity Shader入门精要》