Please add an option to use ARGB Half render textures for the mirror’s target render textures instead of the ARGB 32 textures they currently use.

This allows mirrors to get proper tone mapping and bloom applied to what they render which allows easy and complete parity between what you see in a mirror and what you see in a world when using the post processing stack.

I have attached an example of a particularly bad case for mirrors. The first picture shows the scene and what it should look like, along with the camera positions used for the demo. The second picture shows a comparison of what happens with each texture format. The third picture is an in-game capture to demonstrate the same color saturation happening on mirrors. The first two pictures are done using cameras pointing to render textures and quads sampling from those render textures for their emissive channel since mirrors aren’t available in editor.

The left quad is using a render texture of ARGB32 in the same way that mirrors do. This causes the cameras to do the HDR to LDR resolve without any decent tonemapper applied or bloom filter which causes the colors to saturate before they can even make their way to be rendered on the mirror quads. The right quad is using ARGB Half as the format which prevents the colors from getting clamped before the mirror quad gets rendered. This allows the color values >1.0 to make their way to the reference camera’s post processing stack correctly and have proper tonemapping and bloom applied.

This is pretty much a 2 line fix. You just need to add a public bool useHDRTextures; or something and wherever the render textures are created you just and pass something like RenderTexture mirrorRenderTex = RenderTexture(renderTexWidth, renderTexHeight, 24, (useHDRTextures && mirrorCam.allowHDR) ? RenderTextureFormat.ARGBHalf : RenderTextureFormat.ARGB32);

Performance characteristics:

Tests done on a GTX 1080 ti @ 4098x2048 render texture resolution

With MSAA disabled on the render targets you actually get better performance by omitting a blit from an internal ARGB Half texture to the bound ARGB32 texture (though you can also get this benefit by disabling HDR on the mirror camera for ARGB32). With MSAA you do get worse performance though.

No MSAA ARGBHalf: 1.477ms

No MSAA ARGB32: 1.693ms

2x MSAA ARGBHalf: 2.321ms

2x MSAA ARGB32: 2.22ms

8x MSAA ARGBHalf: 5.672ms

8x MSAA ARGB32: 3.269ms