Download

Reflection captures extremely aliased, why not capture at higher res and downscale?

Reflection captures are extremely aliased. I have a scene with a neon sign so it has a thin geometry with an emissive material and easily gets aliased at low resolutions (subpixel culling even makes lots of it not show up).

But for reflection captures that aren’t captured at runtime, why doesn’t the engine capture at a really large resolution and then downscale?

I know I can move to higher resolution reflection captures as a work around, but that can have a big runtime performance cost whereas this wouldn’t.

Looking through the code it seems there is:

int32 GSupersampleCaptureFactor = 1;

that is usable for this. The variable seems to be hardcoded and not actually exposed anywhere. It should probably be exposed as a CVar for people to find more easily and not have to recompile.

After raising it up to 10 or so it still seems almost just as aliased as before =/

It seems that the supersampling just copies things over with DrawRect, which throws away all the supersampling beyond 2x (does simple bilinear downsampling).

To prevent aliasing and allow more than 2x supersampling, it would need to downscale things by averaging more than just neighbor pixels, which is all DrawRect will be able to give.

Setting GSupersampleCaptureFactor = 2 gives a huge improvement, anything beyond two starts approaching the same quality as GSupersampleCaptureFactor = 1, because the downsampling itself becomes more and more aliased the higher res it gets and the four texels it is blending between become closer and closer together in scene space. The downsampling instead should use something similar to the mip generation found elsewhere in ReflectionEnvironmentCapture.cpp

I made PR to expose GSupersampleCaptureFactor as CVAR. https://github.com/EpicGames/UnrealEngine/pull/5807