简介:shaderlab 基础篇
一、什么是渲染管线?
简单来讲就是计算机将图形数据,经过计算处理最后输出到屏幕上去的过程(Shader只是这其中的一部分)。也可以说是计算机将一系列的定点数据、纹理、光照等信息,最终转换成一张人眼可以看到的图像,这个过程是由CPU与GPU共同完成。
渲染流程 可分为三个概念性的阶段: 应用阶段, 几何阶段, 光栅化阶段。 (其中每个阶段还包含了若干子阶段)
- 应用阶段 : 主要为CPU负责
(1). 准备场景数据
如:摄像机的位置、视锥体,场景的模型,使用的灯光,材质等。
(2).粗粒度剔除(简单的剔除);
主要剔除掉那些摄像机看不到的物体,就不用传给下一阶段。
(3).输出渲染图元
渲染图元里面就是点、线、三角面等,包含了使用的材质,纹理,使用的shader等等。 - 几何阶段: GPU负责
处理所有与几何相关的事情。
(1).顶点着色器 可完全编程控制
(2).曲面细分着色器
(3).几何着色器
(4).裁剪
(5).屏幕映射 - 光栅化阶段: 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,这个合并的过程也挺废资源。
除了批处理技术,我们还可以减少 大量小网格的使用,但如果避免不了使用时,我们可以考虑将他们进行合并。 还可以 避免使用过多的材质。尽量在不同的网格之间使用相同的材质。