I’ve been away at PAX and other obligations, but will give my best answer that I can.
“Resolution” types. Know that in most engines these are general terms and not “official”, so that’ll be true here. The below is all generalized so if people know the deeper GD5 technical impacts behind this feel free to chime in.
- Project resolution - The resolution you set in your project properties.
- Internal Resolution (sometimes also camera resolution) - The resolution actually being rendered by the engine. The amount of full pixel position coordinates it has available for calculations for like position, movement, rotation, etc. The higher the resolution here the smoother the movement will be because it has more positions to move to. This defaults to the project resolution above, unless you have the “Update resolution during the game to fit screen or window size” option checked, or you’ve changed the resolution via events. This limits your asset size/resolution visible on the screen, but does not guarantee how the graphics are displayed on your monitor.
- Canvas Resolution (sometimes also windows resolution) - The resolution of the actually rendered graphics within the window. This is still true even when fullscreen. No matter what the above two res types are set to, this resolution is capped by your monitor and/or the size of the window.
Let’s ignore zoom for right now:
Even if your project and internal resolution are set to 1080p (1920x1080), if you have it in a window that is smaller than that, your graphics are scaled to fit that window. You still have 1920x1080 positions available for movement, but now your graphics are limited by whatever canvas/window resolution your window is set to.
Let’s talk about zoom:
When you zoom in on something, you’re simply scaling it upwards. It doesn’t make more details or modify the original assets, it just takes what was there and scales it by whatever zoom factor you have. This means if your original asset is 32x32 pixels, and you zoom 2x, those assets are now rendered at 64x64 pixels.
Let’s talk about combining the above:
You have your game assets designed to look a certain way at 640x360 and have your project resolution set to this. If you fullscreen this on a 1080p monitor, it scales up the canvas resolution 1:1 to fit, which is 3x larger. Your assets is now rendered as 96x96 pixels on your screen but takes up the same space as it would if you took a screenshot and then rescaled it to 1920x1080 in an image editor. Your internal resolution is still 640x360 so you do not have the additional coordinate positions you would get by changing to 1080p.
In your case, you instead are changing your internal resolution to 1920x1080 when fullscreened (so no scaling is happening to the canvas resolution). If you do not zoom at all, your asset now takes up a much smaller portion of the screen (because your canvas resolution has increased AND your internal resolution has increased, so the camera resolution is much further pulled out). You are only zooming in by 2x. This means the asset is now 64x64, which is an integer scale meaning that every 1 pixel is now zoomed to take up 2 pixels of space and visually looks appropriate.
You then change from fullscreen to a 720p window. Your internal resolution is unchanged, your zoom is unchanged. Your window resolution has changed to 1280x720, but the internal resolution is still 1920x1080, as is the zoom factor and graphical rendering. This means you’ve gone from 1x size at 640x360 to 2x size assets at 1920x1080, Now you’re asking it to take that 1080p asset and make it fit a 720p window (75% of 1080p). The only way for it to do that is take that 64x64 asset and try to render it as 48x48 (75% size) pixels (or inversely, take a 32x32 asset and make it 48x48), which is impossible to do since there’s no way for a monitor to render 2 pixels into 1.5 pixels. So the engine and your monitor try to do the closest it can by merging some pixels or stretching others. This leads to the distortion. If you had your zoom to 3x (96x96) when at 1080p, going to 75% size is 2x (64x64) which it can do as that’s a direct integer scale and no half pixels are needed.
If your graphics are not the size you want with direct integer scaling (3x zoom at 1080p, 2x at 720p), the only options would be: Redo your assets, live with the pixel distortion, or try to use linear scaling (which will cause a softening effect and still have distortion but less visible due to the softening)