6_GPU模块
渲染流水线
应用阶段:准备基本数据(场景里物体的位置,大小,朝向,法线等),设置渲染状态,调用Draw Call
几何阶段:顶点着色器,曲面细分,几何着色器,顶点裁切,屏幕映射
光栅化阶段:三角形设置,三角形遍历,片段着色器
逐片元操作:模板测试,透明度测试,深度测试,混合
在渲染流水线中有2个指标往往是GPU性能瓶颈的根源:填充率和内存带宽
填充率
填充率越高,说明每秒可以处理的片元数量越多,在复杂的场景中往往需要对一个物体进行多次绘制才能达到期望的效果,效果越复杂绘制的次数就越多,随着绘制次数的增加,填充率的消耗也会增加,当填充率无法满足复杂的场景需求时,就会导致渲染一个画面所需的时间增加,从而出现帧率下降的问题
内存带宽
内存带宽指的是GPU与显存之间的传输速率,它表示GPU能够从显存读取或写入数据的速度,复杂的场景通常需要使用更多的内存带宽来处理,当内存带宽被消耗太多就会导致帧率降低和图像质量降低,严重时会导致应用卡死
光照和阴影
渲染有两种不同的方式:前向渲染和延迟渲染,它们对光照的性能都有很大的影响
可以在摄像机组件的Rendering Path 选项中设置

也可以在Project Setting中进行设置

前向渲染
在前向渲染中,每个对象都通过同一个着色器进行多次渲染。渲染的次数取决于光源数量,距离,和亮度,每个对象都需要考虑所有光源对其的影响,如果物体会被光源照射到,那么就要迭代场景中的所有像素,然后将被光线影响到的像素和之前的像素进行混合,这时不参与光照的像素也会被迭代,这样做会导致像素出现重复绘制,同时由于每个灯都要进行一次单独的渲染,使用前向渲染的方式处理有大量灯光的场景将导致出现大量的Draw Call
流程为:待渲染几何体 → 顶点着色器 → 片元着色器 → 渲染目标

延迟渲染
主要解决大量光照的渲染方案,延迟渲染的实质,是先不要做迭代三角形做光照计算,而是先找出能被光照所影响到的所有像素,再去MRT中迭代光照
流程为:待渲染几何体 → 顶点着色器 → MRT → 光照计算 → 渲染目标
其中MRT就像一张RenderTexture图,只不过里面包含了物体深度,法线,颜色之类的信息,然后光照计算结算就需要读取MRT数据生成光照信息,这样在最后绘制时每个像素只需要绘制一次就可以得到光照信息,减少了重复绘制的操作
unity的URP渲染管线是不支持延迟渲染的,一般延迟渲染只会用于场景复杂的大型的项目

渲染性能优化

填充率优化
合适的分辨率
可以使用2个摄像机将场景和UI分开进行渲染,通过控制场景的分辨率减轻GPU的负担
Overdraw
在同一帧中多次绘制同一个像素会发生Overdraw
默认渲染管线可以在Scene视图切换场景绘制模式查看Overdraw视图,在这个视图模式下,半透明物体会显得比不透明物体更亮一些

URP渲染管线可在Rendering Debugger(Window → Analysis → Rendering Debugger)视图开启Overdraw选项,查看Overdraw视图



内存带宽优化
选择合适的纹理尺寸与压缩格式
较小的纹理大小可以减少GPU对纹理的写入和读取操作,同时应该保证纹理的大小为2的次幂,这样可以加快GPU的读取速度
合适的压缩格式可以减小纹理文件大小,从而降低对GPU内存带宽的需求
使用LOD
Lod Group组件可以将网格分为不同的细节,当摄像机离的近时显示高精度模型,离得远显示低精度模型
减少Shader复杂度
避免复杂的运算
避免使用高精度浮点数进行计算
避免类型转换
避免使用if,switch分支语句
减少纹理采样次数
控制场景中激活相机的数量
Unity中每个激活的相机都会将自身的视锥体信息发送给渲染管线,渲染管线根据这些信息对场景中的物体进行视锥体剔除的操作,如果有摄像机处于激活状态,同时这个相机看到的内容不出现在游戏画面中,那这时去计算这个相机的视锥体信息就会造成无意义的浪费

后处理
只要开启了Post Processing选项,即使不做任何处理也会产生额外的开销

不同的后处理效果会有不同的开销
几乎无开销
通道混合器(Channel Mixer)
颜色调整(Color Adjustments)
颜色曲线(Color Curves)
提升,伽马,增益(Lift Gamma Gain)
阴影,中间调,高光(Shadows Midtones Highlighrts)
色调分离(Split Toning)
白平衡(White Balance)
暗角(Vignette)
胶片颗粒(Film Gtain)
色散(Chromatic Aberration)
会产生额外的Draw Call(对Draw Call的影响由高到低排列)
辉光(Bloom)
景深(Depth Of Field)
运动模糊(Motion Blur)
帕尼尼投影(Panini Projection)