渲染流程
cpu阶段
数据从内存加载到显存:
- 模型:Mesh、Shader、材质等
- 摄像机:位置、视锥体、朝向
- 光源:位置、类型参数等
设置渲染状态:
- 即场景中的网格如何被渲染,包括使用哪个顶点着色器、片源着色器、材质、光源属性等
- 对于渲染状态相同的网格,会一起渲染;对于状态不同的网格,会再次设置新的渲染状态
调用DrawCall,绘制Mesh:
- 设置渲染状态,相同的网格一起渲染,再次设置新渲染状态,符合的再次进行渲染,依次类推
renderstate drawA drawB renderstate drawC renderstate drawD ...
- Unity中,每次引擎准备数据通知GPU的过程就是一次DrawCall,这一个过程是逐个物体进行的
- DrawCall Batching:主要目标就是一次DrawCall处理多个物体,而不是一个。核心在于会检查所有要绘制的物体的材质,将相同材质的分为一组(一个Batch),然后将他们组合成一个物体(统一变换)
- DrawCall Batching缺点:
- 相当于组合创建了一个超大物体,相应的需要分配更大内存和apu计算时间
- 对于静止物体组合一次就可以一直使用,对于运动物体,每一帧都得重新组合,反而更消耗性能
- 现代cpu中,一味减少drawcall并不一定可以让帧数变高,移动设备才更需要注意
gpu阶段
- 几何阶段:MVP变换
- M变换:模型变换,模型坐标转变为世界空间坐标
- V变换:视图变换,世界空间坐标转变为视图空间坐标(视图坐标,即相机标准位置0,看向Z方向,向上方向为Y轴)
- 顶点着色器Shader:输入变换矩阵、顶点属性等
- P变换:投影变换(裁剪变换),正交投影或者透视投影,视图空间坐标转变为齐次裁剪空间,也就hi转变为相对于视锥体中心的坐标,方便进行裁剪
- 裁剪:视锥剔除、视口裁剪,将不在视口中物体丢弃,部分在的物体进行多边形裁剪生成新的多边形
- 视锥剔除:在cpu阶段运行,通过AABB盒、OBB盒与视锥体进行碰撞检测,剔除完全不可见的物体,精度较低
- 视口裁剪:将视口之外的物体丢弃,部分在内部的物体进行裁剪,生成多边形,也就是裁剪生成新的顶点再次渲染
- 背面剔除:在顶点着色器和片元着色器之间运行,根据图片朝向相机进行判断是否需要剔除
- 遮挡剔除:主要用于静态物体多的场景
- 屏幕映射:三维空间坐标转变为屏幕坐标(齐次裁剪坐标映射到屏幕坐标)
- 三角形设置:屏幕坐标顶点生成对应三角形
- 光栅化阶段:
- 光栅化处理:采样成像素,计算三角形网格内的覆盖的像素点
- 片元着色器:(像素着色器)逐像素进行着色(将三角形按照重心,插值的方式将颜色、位置、法线等等赋给像素点)
- 将像素的结果写入颜色缓冲区
- 帧缓冲器:显卡中硬件实现,用于存放最终渲染结果,为了避免我们看到正在光栅化的图形,GPU一般使用双重缓冲,一个用于前面显示,另一个用于后面渲染,这样保证图像时连续的
原文作者:一只流浪的猿
原文地址: https://blog.csdn.net/jason_hw5d/article/details/123248945
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/jason_hw5d/article/details/123248945
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章