URP介绍
UPR前身是LWRP,区别是URP集成了postProcessing。主要是为移动平台设计。UPR相当于SBP(可编程渲染管线)里的一个模板。Universal RP包里可以看到源码。
区别:
1.光照:
传统Bulidin渲染管线的光照是多Pass渲染,每多一个动态光就多一个Pass,这个光影响的物体就要多画一遍。eg:所有物体都受动态光影响,则m个动态光,n个物体,绘制次数m*n。
URP实现了单Pass渲染光照。也就是上面的例子,最后绘制只需要n次。但URP中限制了灯光的数量。目前是支持1詹平行光,每个对象最多只能接受4个动态光。(版本不同可能不一样)
2.URP的shader可以使用 Shader Graph,HLSL编写的shader,CG语言因为已经停止更新很多年,所以使用的代码库是HLSL。也支持CG,比如:Bulidin管线中使用CG的Unlit Shader可以延用。Bulidin管线中的其他shader都不能支持。
3.批处理:
之前Unity支持:动态批处理,静态批处理,GPU Instancing。SRP在原来的基础上还支持SRP Batcher。SRP Batcher不会减少Draw Call数量,但可以减少Set Pass Call的数量。并减少绘制命令的开销。
减少绘制命令的开销的原因:CPU不需要每帧都给GPU发送渲染数据,如果数据没有变化,就保存在GPU内存中,每个绘制仅调用包含一个指向正确内存位置的偏移量。(值传递变成了引用传递?!)
减少Set Pass Call的原因:传统批处理的前提是同一材质,SRP的判断依据是Shader 变种是否变化,Shader变种相同,即使是不同材质都不会被打断。
底层原理:
SRP会在主存中将模型的坐标信息、材质信息、主光源信息阴影参数和非主光源阴影参数分别保存到不同的CBUFFER(常量缓冲区)中,只有CBUFFER发生变化才会重新提交到GPU并保存。
CBUFFER在Shader中就是包含各种声明的Property。所以支持CG的UnlitShader是不能使用SRP
Batcher的。只有使用了名为UnityPerMaterial的CBUFFER才能使用SRP Batcher。
官网上的对比: