Unity渲染流程(渲染管线)(渲染流水线)
计算机图形库的渲染命令由显卡驱动(GPU Driver)翻译成GPU(图形处理器)能识别的语言,然后GPU读取显存中由渲染命令指定的数据(draw call则是把要求GPU根据顶点数据进行绘制, SetPass call时,会向显存中传递大量的资源信息,包括纹理资源也是在这时候加载到缓存中)
一 渲染的任务
渲染流水线的工作任务在于==由一个三维场景出发、生成(或者说渲染)一张二维图像。==换句话说,计算机需要从一系列的顶点数据、纹理等信息出发,把这些信息最终转换成一张人眼可以看到的图像。而这个工作通常是由CPU和 GPU共同完成的。
二 三个概念阶段
三 应用阶段
CPU负责实现,这一阶段最重要的输出是渲染所需的几何信息,即渲染图元(rendering primitives)。通俗来讲,渲染图元可以是点、线、三角面等。这些渲染图元将会被传递给下一个阶段——几何阶段。
1 准备好需要被渲染的场景数据,做粗粒度剔除
摄像机的位置,视锥体,场景中的模型,场景中的光源,粗粒度剔除也就是视锥体剔除在这个阶段做,以包围盒为单位
准备好数据后加载到显存
所有渲染所需的数据都需要从硬盘(Hard Disk Drive,HDD)中加载到系统内存(RandomAccess Memory,RAM)中。然后,网格,位置信息,法线方向,顶点颜色,纹理坐标等数据又被加载到显卡上的存储空间——显存( VideoRandom Access Memory,VRAM)中。这是因为,显卡对于显存的访问速度更快,而且大多数显卡对于RAM没有直接的访问权利。图2.3所示给出了这样一个例子。
2 设置每个对象的渲染状态。
渲染状态包括所使用的着色器shader、纹理、材质(漫反射颜色,高光反射颜色)等。
什么是渲染状态呢?一个通俗的解释就是,这些状态定义了场景中的网格是怎样被渲染的。例如,使用哪个顶点着色器(Vertex Shader)/片元着色器(Fragment Shader)、光源属性、材质等。如果我们没有更改渲染状态,那么所有的网格都将使用同一种渲染状态。图2.4显示了当使用同一种渲染状态时,渲染3个不同网格的结果。
3 发送DrawCall。
当给定一个DrawCall