【Unity Shader】渲染管线

流程概述

应用程序阶段

应用程序阶段,使用高级编程语言(C、C++、JAVA 等)进行开发,主要和CPU、内存打交道,诸如碰撞检测、场景图建立、空间八叉树更新、视锥裁剪等经典算法都在此阶段执行。在该阶段的末端,几何体数据(顶点坐标、法向量、纹理坐标、纹理等)通过数据总线传送到图形硬件。

几何阶段

几何阶段,主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射,该阶段基于GPU进行运算,在该阶段的末端得到了经过变换和投影之后的顶点坐标、颜色、以及纹理坐标。
光照计算属于几何阶段,因为光照计算涉及视点、光源和物体的世界坐标,所以通常放在世界坐标系中进行计算。

光栅阶段

光栅阶段,基于几何阶段的输出数据,为像素(Pixel)正确配色,以便绘制完整图像,该阶段进行的都是单个像素的操作,每个像素的信息存储在颜色缓冲器(color buffer 或者 frame buffer)中。

​雾化以及涉及物体透明度的计算属于光栅化阶段,因为上述两种计算都需要深度值信息(Z 值),而深度值是在几何阶段中计算,并传递到光栅阶段的。

从几何阶段到光栅化阶段:

  1. 几何阶段:变换三维顶点坐标和光照计算

    1. 将模型空间坐标(object space coordinate)通过四阶矩阵变换矩阵(world matrix)转换为世界空间坐标( world space coordinate )。
      • 进行光照计算。
      • 将模型空间下的顶点法向量转换为世界空间下的,所用的转换矩阵为world matrix的转置矩阵的逆矩阵。
    2. 将物体顶点坐标从世界空间(world space)转换到观察空间下(eye space)。
    3. 将顶点坐标从观察空间下转换到裁剪空间下(project and clip space)。
      • 投影:用透视变换矩阵把顶点从视锥体(viewing frustum)中变换到裁剪空间的规范立方体(CVV)中。
      • 图元装配(Primitive Assembly):将顶点根据原始的连接关系还原出网格结构。
      • 裁剪:在CVV中将位于视体外的场景数据去除。
    4. 将得到的完全位于视体中的场景数据映射到屏幕坐标系上。
  2. 光栅化阶段:决定哪些像素被集合图元覆盖。

    1. 将顶点以及绘制图元对应到像素。

    2. Pixel Operation
      • 消除遮挡面。
      • 纹理操作(Texture operation):根据像素的纹理坐标,查询对应的纹理值。
      • 混色(Blending):根据目前已经画好的颜色,与正在计算的颜色的透明度(Alpha),混合为两种颜色,作为新的颜色输出。
      • 滤波(Filtering):将正在算的颜色通过某种滤波后输出。

猜你喜欢

转载自www.cnblogs.com/zhang-mo/p/9834094.html