Why need additional draw call for each per pixel light in forward rendering? Why not just upload all lights information into constant buffer ,and loop through all of them in pixel shader and add up the result?
It seems UE is doing so. Any particular reason unity3d not doing forward in such a way?
Because that’s how forward rendering works: it is more efficient for mobile devices, better at transparency, but more costly if you have a lot of per-pixel lights.
Note that UE4 does not support forward rendering - it only has a deferred rendering pipeline. If you want that behaviour, just switch Unity to deferred rendering mode