《Unity Shader入门精要》笔记——渲染流水线

一个渲染流程分成三个阶段:应用阶段几何阶段光栅化阶段

应用阶段

应用阶段通常由CPU负责,开发者可以完全控制该阶段。
该阶段主要有三个任务:

  1. 准备好场景数据,例如摄像机位置、视锥体、所用模型、光源等;
  2. 做粗粒度剔除(culling)工作,把不可见的物体剔除,提高渲染性能;
  3. 设置好渲染状态,包括使用的材质、使用的纹理、使用的shader等。

该阶段最主要是输出渲染所需的几何信息,即渲染图元
应用阶段可分为3个阶段:

  1. 把数据加载到显存中(硬盘→内存→显存),加载的数据包括顶点位置信息、法线方向、顶点颜色、纹理坐标等。
  2. 设置渲染状态,即设置用什么渲染,使用哪个顶点着色器、片元着色器、光源属性、材质等。
  3. 调用Draw Call,即CPU发送给GPU的一个指令,命令GPU开始渲染一个需要被渲染的图元列表。

GPU流水线

GPU渲染的过程就是GPU流水线。包括几何阶段光栅化阶段
几何阶段和光栅化阶段都可以分成更小的流水线阶段。每个阶段GPU提供了不同的可编程性和可配置性。

  • 几何阶段包括:顶点着色器、(曲面细分着色器)、(几何着色器)、裁剪、屏幕映射。

  • 光栅化阶段包括:三角形设置、三角形遍历、(片元着色器)、逐片元操作。
    GPU流水线的输入是顶点数据(包括顶点位置信息、顶点颜色等),输出是屏幕图像(颜色信息)。

  • 顶点着色器:顶点着色器主要任务是坐标转换(对顶点的坐标进行某种变换)和逐顶点光照。完全可编程。

  • 裁剪:将视野外的顶点去除,在视野的边界处形成新的顶点。不可编程。

  • 屏幕映射:把图元的x、y坐标转换到屏幕坐标系下。对z坐标不做处理。不可编程。

  • 三角形设置:计算光栅化三角网格所需的信息(三角形边界表示方法、边界像素坐标、整个三角网格对像素的覆盖情况),为下阶段做准备。

  • 三角性遍历:使用上个阶段的计算结果,检查每个像素是否被一个三角网格覆盖,如果被覆盖,则会生成一个片元(fragment),每个片元的状态会根据三个顶点的信息进行插值得到。该阶段也称为扫描变换。最后输出一个片元序列。(片元不是真正意义上的像素,而是包含了诸多状态的集合,这些状态会用于计算最终像素的颜色)。

  • 片元着色器:输入上一个阶段得到的片元信息,计算片元的输出颜色。

  • 逐片元操作:通过测试,决定每个片元的可见性。如深度测试、模板测试。如果一个片元通过了所有测试,则把片元的颜色值与颜色缓冲区里的颜色进行混合。该阶段可配置。

Drag Call

含义:CPU调用图像编程接口。

使用命令缓冲区,使CPU和GPU可以并行工作。命令缓冲区中包含命令队列,CPU向其中添加命令,GPU则读取命令,二者相互独立。Drag Call是其中一种命令,其他命令还包括改变渲染状态(改变着色器、改变纹理等)的命令。CPU提交Drag Call前需要完成一些准备工作,如果Drag Call过多,CPU就需要话费大量时间在提交命令上。

为了减少Drag Call,可以使用批处理的方法。即把很多很小的DragCall合并成一个大的DragCall。但合并需要时间,因此批处理技术适合静态的物体。

在游戏开发中减少Drag Call主要有两点:

  1. 避免使用大量很小的网格,不可避免使用时,考虑合并网格。
  2. 避免使用过多的材质。

你可能感兴趣的:(《Unity Shader入门精要》笔记——渲染流水线)