考察render path与drawcall的关系,每个camera可以单独设置render path。以计算光照,不考虑batching,且只有一个PASS的材质为样本,比如Diffuse;如果材质不受光照影响,则跳过光照相关的PASS,比如Unlit/Texture。
1.Forward Path.
最亮的directional light(自动成为pixel light)与其他的非pixel light一起被forward base PASS一次性绘制。其余的important light(强制PIXEL LIGHT),每个都会产生一次forward add PASS的drawcall,且是该光源影响的物体个数每个产生一次drawcall;如果不足3个(可设置)important light则按亮度选出前3个执行forward add PASS。当PIXEL LIGHT与物体较多的场合,会产生迅猛的drawcall增长。假设所有IMPORTANT光源影响所有物体,那么多出的drawcall=光源数*物体数。自写的shader会依据是否使用光照和pass个数对drawcall产生影响。pixel light才能对normal map specular map等基于纹理图像的效果产生作用,光源多场景复杂的情况下,需要考虑deferred path。
2.Deferred Path.
Deferred Path在UNITY中没有实现透明物体渲染和全屏抗锯齿功能(MSAA),透明物体渲染会在非透明物体完成deferred的final pass后使用forward path来渲染。所有的光源全为pixel light(默认只提供blinn-phone),一个光源产生一个drawcall,且与场景复杂度无关,即只要该光源影响到屏幕结果就会产生一个drawcall,drawcall=光源数+物体数*2+1。其中2为base pass的NORMAL+SPECULAR 和 depth,depth pass是否单独执行与显卡和设置的环境有关,每个光源执行light pass,最后一个全屏的final pass得到最终结果。
换句话说,forward把几何与光照放在一个PASS里执行了,而deferred对几何信息与光照分别执行,产生了解耦的作用。
3.Vertex Lit Path.
一个物体一个drawcall。
4.Shadow.
待续。
Unity RenderPath与Drawcall