渲染流程

cpu阶段

  1. 数据从内存加载到显存:

    • 模型:Mesh、Shader、材质等
    • 摄像机:位置、视锥体、朝向
    • 光源:位置、类型参数等
  2. 设置渲染状态:

    • 即场景中的网格如何被渲染,包括使用哪个顶点着色器、片源着色器、材质、光源属性等
    • 对于渲染状态相同的网格,会一起渲染;对于状态不同的网格,会再次设置新的渲染状态
  3. 调用DrawCall,绘制Mesh:

    • 设置渲染状态,相同的网格一起渲染,再次设置新渲染状态,符合的再次进行渲染,依次类推
    • renderstate drawA drawB renderstate drawC renderstate drawD ...
    • Unity中,每次引擎准备数据通知GPU的过程就是一次DrawCall,这一个过程是逐个物体进行的
    • DrawCall Batching:主要目标就是一次DrawCall处理多个物体,而不是一个。核心在于会检查所有要绘制的物体的材质,将相同材质的分为一组(一个Batch),然后将他们组合成一个物体(统一变换)
    • DrawCall Batching缺点:
      • 相当于组合创建了一个超大物体,相应的需要分配更大内存和apu计算时间
      • 对于静止物体组合一次就可以一直使用,对于运动物体,每一帧都得重新组合,反而更消耗性能
    • 现代cpu中,一味减少drawcall并不一定可以让帧数变高,移动设备才更需要注意

gpu阶段

  1. 几何阶段:MVP变换
    1. M变换:模型变换,模型坐标转变为世界空间坐标
    2. V变换:视图变换,世界空间坐标转变为视图空间坐标(视图坐标,即相机标准位置0,看向Z方向,向上方向为Y轴)
    3. 顶点着色器Shader:输入变换矩阵、顶点属性等
    4. P变换:投影变换(裁剪变换),正交投影或者透视投影,视图空间坐标转变为齐次裁剪空间,也就hi转变为相对于视锥体中心的坐标,方便进行裁剪
    5. 裁剪:视锥剔除、视口裁剪,将不在视口中物体丢弃,部分在的物体进行多边形裁剪生成新的多边形
      • 视锥剔除:在cpu阶段运行,通过AABB盒、OBB盒与视锥体进行碰撞检测,剔除完全不可见的物体,精度较低
      • 视口裁剪:将视口之外的物体丢弃,部分在内部的物体进行裁剪,生成多边形,也就是裁剪生成新的顶点再次渲染
      • 背面剔除:在顶点着色器和片元着色器之间运行,根据图片朝向相机进行判断是否需要剔除
      • 遮挡剔除:主要用于静态物体多的场景
    6. 屏幕映射:三维空间坐标转变为屏幕坐标(齐次裁剪坐标映射到屏幕坐标)
    7. 三角形设置:屏幕坐标顶点生成对应三角形
  2. 光栅化阶段:
    1. 光栅化处理:采样成像素,计算三角形网格内的覆盖的像素点
    2. 片元着色器:(像素着色器)逐像素进行着色(将三角形按照重心,插值的方式将颜色、位置、法线等等赋给像素点)
    3. 将像素的结果写入颜色缓冲区
    4. 帧缓冲器:显卡中硬件实现,用于存放最终渲染结果,为了避免我们看到正在光栅化的图形,GPU一般使用双重缓冲,一个用于前面显示,另一个用于后面渲染,这样保证图像时连续的
    原文作者:一只流浪的猿
    原文地址: https://blog.csdn.net/jason_hw5d/article/details/123248945
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞