Why is dynamic resolution not possible on PC?

Hi, I heard that dynamic resolution is not possible on PC because it conflicts with distance fields? but this seems like an unlikely reason. So what’s the real reason?

It is possible, but you will get hitches due to the 3d light grid constantly being reallocated every time resolution changes by more than the cell size. I got it to work smoothly by just overallocating the lightgrid to the max dynamic res so that it never needs to be reallocated. I’m not using distance fields so I’m not sure about any issues there.

Volumetric fog causes the same reallocation issues as the light grid due to its own grid. I haven’t fixed that one yet because it resamples itself temporally over time and will need some kind of 3d rescaling operation for the previous history or something (from what I can tell anyway, I don’t know enough about how it is working).

1 Like

Thanks for the detailed response. That’s so strange to hear, that dynamic resolution doesn’t play nice on PC even if you can get it working… How is it that it works without those issues on console? I assume that it works on PS4 while also still being able to use volumetric fog?

I’m not sure, they may tune stuff like “r.VolumetricFog.HistoryMissSupersampleCount”, and maybe just update the dynamic res less in general to make it less apparent. I may be wrong and was just seeing something else like just the aliasing planes shifting, I don’t think I was using a high enough history percentage to get rid of all the aliasing at the grid sizes I was using to test in VR.

The allocation hitches with either grid don’t happen on consoles or iGPUs I think due to integrated memory.

Intel iGPUs are special cased to allow dynamic res on PC by default, but it says in the code it is due to getting providing better timing information without bubbles. I only use dynamic res with VR and get the timing info from SteamVR which doesn’t seem to have any issues even with dedicated GPUs.

I’ve looked into it a good bit more.

With a high history percentage it does look fine with dynamic res, but I am seeing the same hitching as with the lightgrid. One fix would be to allocate a larger buffer and only use a portion of it. It would require adjusting/clamping uvs in many shaders and adjusting the compute shaders.

It can’t be overallocated in the same was as I was able to for the lightgrid in dx11 from what I can tell, because of the grid stride and the way samplers will work from it (the lightgrid was just always looking up by index).

However, d3d12 supports custom allocators and it should be possible there without too many changes.

Ah, sorry for the late response. Again thank you for such a detailed response. Based on everything you’ve said, these lower level technical details are beginning to go over my head a little. It seems that I’m a bit out of my depth here, so unfortunately I guess I’ll have to abandon having dynamic resolution in my future games. It’s a shame that epic haven’t taken a full swing at bringing dynamic res to PC considering it is such a useful feature.

Hello. How did you manage to get dynamic resolution working on pc?
I found only few comments on UE forums about that, one person said that the engine code needs to be changed; bool GRHISupportsDynamicResolution = true;
in: Engine/Source/Runtime/RHI/Private/RHI.cpp
The other person said that there needs to be “Funktion” pasted in “widget funktion lib” to enable DynRes on PC.
I really don’t want to start messing with files that I don’t have deeper understanding of, before I check in with someone who knows more about it than I do, especially since I work in BP and not C++.
I will be very grateful with any help concerning my question.