目的:为了处理多个光源渲染,效能与场景里灯光的数量有关系,比较适合手机平台。延迟渲染比较适合主机平台,与渲染的分辨率有关
前向渲染(ForwardBase):把每一个物体用每盏灯渲染一遍,再将渲染的结果混合起来
开销:灯光数量*场景中要被灯光渲染的物体数量 平行光<点光源<聚光灯
Unity光照模式:1.逐像素 2.逐顶点 3.球谐函数
角色和光源可能是动态的,如何保持平衡帧率
unity在底层有优化,Pixel Light Count是最大逐像素灯光的数量,对小球的光照效果最明显的灯光,其余灯光是使用逐顶点或者球谐函数
灯光亮度(Intensity)unity底层有个排序
Render Mode:Not Important 会按逐顶点或者球谐函数来处理
Important 会按逐像素处理
灯光D既受像素光影响又受顶点光影响
Tags{"LightMode" = "ForwardBase"} //基础pass 一盏平行光(逐像素光照)、所有顶点光、所有球谐
Tags{"LightMode" = "ForwardAdd"} //额外的逐像素光照
分Base和Add的目的是:base通道里渲染主灯光和性能开销比较小的逐顶点光和球谐光,其余消耗比较高又不重要的放在add里面渲染
而对于逐顶点/SH光源来说,它们都将会在Bass Pass中处理(和最重要的平行光一起)。没分量就是这种结果。那么,Base Pass会说,“我这么小就让我做这么多东西,平行光就一个数量少就算了,SH光工作量少也算了,但顶点光也来捣乱我就不干了,不行!我得有条件!”于是Unity规定说,最多只有4个光源会按照逐顶点光源来处理,其他只能按SH光源处理。
Blend One One :一个源颜色 * 1 + 目标颜色 * 1 目标颜色:已写入帧缓存的颜色 源颜色:即将写入帧缓存的颜色 如果不设置的话 ForwardAdd会把ForwardBase覆盖掉
URP里面合并为一个pass里实现渲染,放在一个pass里可以防止一些效果或者网格渲染因为两个pass造成渲染流水线被打断
#pragma multi_compile_fwdbase //使用在base通道里 //shader变体 会在内部生成很多shader宏定义(标识) shader变体是由unity引擎根据当前渲染方式传入的
#pragma multi_compile_fwdadd //使用在Add通道里
渲染路径的设定:
for (每个逐像素光源)
{
Pass
{
for(模型中的每一个三角形)
{
for(三角形中的每一个片元)
{
if(深度测试失败) //说明该片元是不可见的,丢弃
{discard;}
else
{//如果该片元可见就进行光照计算
float4 color = Shading(materialInfo,...,normal,lightDir,viewDir);
//更新帧缓冲
writeFrameBuffer(fragment,color);
}
}
}
}
}