Shaderlab-Basis(01)-渲染管线

简介:shaderlab 基础篇

一、什么是渲染管线?


简单来讲就是计算机将图形数据,经过计算处理最后输出到屏幕上去的过程(Shader只是这其中的一部分)。也可以说是计算机将一系列的定点数据、纹理、光照等信息,最终转换成一张人眼可以看到的图像,这个过程是由CPU与GPU共同完成。

渲染流程 可分为三个概念性的阶段: 应用阶段, 几何阶段, 光栅化阶段。 (其中每个阶段还包含了若干子阶段)
shaderlab_base_01

  1. 应用阶段 : 主要为CPU负责
    (1). 准备场景数据
        如:摄像机的位置、视锥体,场景的模型,使用的灯光,材质等。
    (2).粗粒度剔除(简单的剔除);
    主要剔除掉那些摄像机看不到的物体,就不用传给下一阶段。
    (3).输出渲染图元
    渲染图元里面就是点、线、三角面等,包含了使用的材质,纹理,使用的shader等等。
  2. 几何阶段: GPU负责
    处理所有与几何相关的事情。
    (1).顶点着色器 可完全编程控制
    (2).曲面细分着色器
    (3).几何着色器
    (4).裁剪
    (5).屏幕映射
  3. 光栅化阶段: GPU负责
    将几何阶段传递过来的数据 产生屏幕上的数据,渲染出最终的图像。
    (1).三角形设置
    (2).三角形遍历
    (3).片元着色器
    (4).逐片元操作

二。什么是DrawCall?


DrawCall被定义为,CPU调用GPU的图像编程接口
形象一点可理解为:CPU 通过一个渲染命令 告诉GPU 如何来渲染CPU所准备的数据,如何渲染包括了使用什么材质, 纹理,着色器等。而这个命令就是DrawCall。

为什么DrawCall多了 会影响帧率/?


    这里先说一个引子,有一个文件夹里面有10 000 个小文件,每个小文件1Kb,总共此文件夹不到10MB。但将此文件夹复制到一个新的地方时,会发现消耗时间非常多; 另外,有一个文件夹里只有一个10MB的文件,将此文件夹复制到另一个文件夹中,会发现消耗的时间非常少。
     在这里要说的是,CPU 调用DrawCall之前还有这样的操作:
          (1).将数据加载到显存中
          (2).设置渲染状态
     渲染状态是 这个要渲染的数据,使用什么网格,什么材质,用什么Shader等。如果渲染状态都一样那就会显示相同的物体。
          (3).最后才是CPU 调用DrawCall 所以 DrawCall多了,CPU 向GPU 发送的内容(数据,渲染状态)也多了,CPU在提交DrawCall时消耗了大量的时间
(注:这里的消耗时间指的是 GPU处理速度很快,所有的渲染工作完成后处于空闲状态,而CPU 新的渲染命令还没发送过来),Cpu的过载。从而导致了影响帧率。

四。如何减少DrawCall


减少DrawCall的方法很多,这里说一下常用的批处理方法; 批处理 的思想是将很多小的DrawCall合并成一个大的DrawCall。 批处理方法 比较适合于静态批处理, 即将场景中的固定物品,如石头,场地等不会移动的物品,这些静态物品只需要合并一次即可。动态批处理是 对动态的物品进行合并,但是需要每帧对物品合并传递给GPU,这个合并的过程也挺废资源。

除了批处理技术,我们还可以减少 大量小网格的使用,但如果避免不了使用时,我们可以考虑将他们进行合并。 还可以 避免使用过多的材质。尽量在不同的网格之间使用相同的材质。