We have a single camera in the scene and it is set to deferred shading rendering path. When run on an iOS device, unity always switches camera to forward rendering path.
The documentation states that deferred rendering “requires a graphics card with Multiple Render Targets (MRT), Shader Model 3.0 (or later), support for Depth render textures and two-sided stencil buffers”.
We have set graphics API to OpenGL ES 3.0, and are running the game on iOS 6 device which does support MRT (up to 256 bits).
There seems to be no reason why deferred shading should not work on these devices.
Can anyone tell me how to make it work, or if it isn’t supported, why?
Also if Unity doesn’t allow this, did anyone try to make their own deferred rendering path within Unity?
Could one force Unity to manually start a g-buffer and lighting passes with custom shaders?
I’ll answer this old question since it comes up in searches. Only certain devices can support Deferred rendering. Even if a device supports Metal, it may not support the deferred path. For example, Metal will fall back to Forward rendering if the device has an A7 chip. The deferred path is only supported on A8 and later. There is a chart on the bottom of this page explaining which devices can use the different rendering paths.
You can see which devices use which chips here.
Update: I have tested that deferred works on Unity 2017. In order to make it work on older devices, you will need to go to the Player settings and remove the Metal graphics API. Make sure that it is only using OpenGL ES 3. If Metal is listed as an API and the hardware does not support deferred in Metal, it will select Metal over OpenGL and then revert back to forward rendering.
Update 2: As of writing, Unity’s own documents contradict themselves about deferred lighting on mobile. Here it leaves blank whether or not deferred is even supported on mobile.