deathkiller / jazz2

🎮 · Jazz² Resurrection: Open-source reimplementation of Jazz Jackrabbit 2
https://deat.tk/jazz2/
GNU General Public License v3.0
491 stars 18 forks source link

Bug: macOS Build doesn't scale sprites correctly. #131

Closed HomeStarRunnerTron closed 8 months ago

HomeStarRunnerTron commented 1 year ago

Hi-hi! Thank you so much for all your tremendous work-- I can't imagine what's needed to be done to preserve this top-notch platformer for modern systems.

I'm on an M1 macOS with a Retina display, and I've noticed that, while the background stuff seems to be scaled properly, Jazz/Spaz is an absolute mess, with irregular divisions of pixels being given double the weight, both horizontally and vertically. And, of course, every time the screen moves around, the uneven areas change places, giving a yucky shimmer.

eycummonwazzup

I thought maybe the Retina display was to blame, but even when I connect it to an non-HDPI external display, the result seems to be the same, so I'm unsure. Fullscreen vs. windowed also doesn't make a difference-- or which build I use (arm64 with or without sdl2/x64 with or without sdl2). And if I go and resize the screen very slightly, I DO get different results on the character. Still can't find the PIXEL-PERFECT RESOLUTION to resize to, though, hehehe. Maybe there's two problems going on here-- this sprite-related resizing, and also the ability to resize the window to non-perfect pixel ratios. Any chance, in the settings, you could also set, like, a 2x, 3x, 4x pixel-ratio dealio? With games like this, the gorgeous pixel art deserves to be just right. All the best, and thank you so-so much for your Time, again!

deathkiller commented 1 year ago

Hi, thanks for playing!

It seems there is something wrong with rendering on your mac. You can try to turn on/off Antialiasing in Options. I don't have any Apple device, so I can't test it. It could be some incompatibility with macOS or OpenGL library there.

Integer scaling with fixed ratio could be added, but I'm not sure it will look any better, maybe it would look even worse with black bars around.

This is how it should look like on 1920x1080 (on my PC with Windows and 100% DPI scaling): image

HomeStarRunnerTron commented 1 year ago

Yeah, that Windows screenshot you posted looks gorgeous-- it would so be my ideal.

The picture I sent was antialiasing disabled. When I enable it... ... nothing changes, visually!

Disabled:

antialisabled

Enabled:

antialiabled

Thank you so much for your response and all you've done! : )

deathkiller commented 1 year ago

It seems to me that game renders it in lower resolution and macOS upscales the final image by 2x, so it looks ugly then. You can check rendering resolution in log (if you run the game from terminal). But I don't know what to do with it. Maybe there is some flag for macOS, but I don't have any experience with it.

HomeStarRunnerTron commented 1 year ago

Yeah, here's the whole Terminal log, starting in fullscreen, then toggling windowed mode. The two resolutions are 3024x1890 & 1440x810. Whatever the case, I really appreciate understanding it a little bit more. : )


       ▗▘▂▅▃▂▊▐                                ▃▂▃  
       ▝▃▀▍▂▂▘▘         ▀▀▅▅▅▅▖▃▀▀▀▃          ▂▗▞▞  
        ▐▍▂▔▗▂▂▂        ▎▀▆▖▋▖▗▋▃▀▔▐▀▆▆▖▂▀▃▃▀▕▍▂▆▆▖ 
      ▗▆▋▐▅▆▍▐▂▗▅      ▗▃▀▝▝▎▐▖▀▆▍▊▍▃▗▀▂▎▀▆▃▃▎▀▀▀▀▆ 
       ▂▂▝▍▁▊▍▀▃▃▆     ▋▃▀▃▃▅▀▀▅▆▀▂▝▃▀▅▅▗▞▝▀▖▎      
         ▝▞▃▝▅          ▆▅▅▅▅  ▔▔ ▆▅▅▅▆▃▀▁▅▃▃       
           ▅                                        
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Jazz2.config" opened
virtual void Death::IO::FileStream::Close() -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Jazz2.config" closed
void nCine::MainApplication::init(std::unique_ptr<IAppEventHandler> (*)(), int, nCine::NativeArgument *) -> IAppEventHandler::OnPreInit() invoked
void nCine::JoyMapping::init(const nCine::IInputManager *) -> Found 156 mappings in 156 lines
void nCine::Application::initCommon() -> Jazz² Resurrection v2.1.0 initializing...
void nCine::GfxCapabilities::logGLInfo() const -> --- OpenGL device info ---
void nCine::GfxCapabilities::logGLInfo() const -> Vendor: Apple
void nCine::GfxCapabilities::logGLInfo() const -> Renderer: Apple M1 Pro
void nCine::GfxCapabilities::logGLInfo() const -> OpenGL Version: 4.1 Metal - 76.3
void nCine::GfxCapabilities::logGLInfo() const -> GLSL Version: 4.10
void nCine::GfxCapabilities::logGLCaps() const -> --- OpenGL device capabilities ---
void nCine::GfxCapabilities::logGLCaps() const -> GL_MAX_TEXTURE_SIZE: 16384
void nCine::GfxCapabilities::logGLCaps() const -> GL_MAX_TEXTURE_IMAGE_UNITS: 16
void nCine::GfxCapabilities::logGLCaps() const -> GL_MAX_UNIFORM_BLOCK_SIZE: 65536
void nCine::GfxCapabilities::logGLCaps() const -> GL_MAX_UNIFORM_BUFFER_BINDINGS: 80
void nCine::GfxCapabilities::logGLCaps() const -> GL_MAX_VERTEX_UNIFORM_BLOCKS: 16
void nCine::GfxCapabilities::logGLCaps() const -> GL_MAX_FRAGMENT_UNIFORM_BLOCKS: 16
void nCine::GfxCapabilities::logGLCaps() const -> GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: 256
void nCine::GfxCapabilities::logGLCaps() const -> GL_MAX_COLOR_ATTACHMENTS: 8
void nCine::GfxCapabilities::logGLCaps() const -> GL_NUM_PROGRAM_BINARY_FORMATS: 0
void nCine::GfxCapabilities::logGLCaps() const -> ---
void nCine::GfxCapabilities::logGLCaps() const -> GL_KHR_debug: 0
void nCine::GfxCapabilities::logGLCaps() const -> GL_ARB_texture_storage: 1
void nCine::GfxCapabilities::logGLCaps() const -> GL_ARB_get_program_binary: 0
void nCine::GfxCapabilities::logGLCaps() const -> GL_EXT_texture_compression_s3tc: 1
void nCine::GfxCapabilities::logGLCaps() const -> GL_AMD_compressed_ATC_texture: 0
void nCine::GfxCapabilities::logGLCaps() const -> GL_IMG_texture_compression_pvrtc: 0
void nCine::GfxCapabilities::logGLCaps() const -> GL_KHR_texture_compression_astc_ldr: 0
void nCine::GfxCapabilities::logGLCaps() const -> ---
void nCine::Application::initCommon() -> Creating rendering resources...
nCine::BinaryShaderCache::BinaryShaderCache(const Death::Containers::StringView &) -> GL_ARB_get_program_binary extensions not supported, binary shader cache is disabled
void nCine::Application::initCommon() -> Application initialized
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/cache.index" opened
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Source/intro.j2v" opened
void GameEventHandler::RefreshCache() -> Cache is already up-to-date
virtual void Death::IO::FileStream::Close() -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/cache.index" closed
virtual void Death::IO::FileStream::Close() -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Source/intro.j2v" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Source/intro.j2b" opened
virtual void GameEventHandler::OnInit() -> Rendering resolution: 3024x1890
void nCine::Application::initCommon() -> IAppEventHandler::OnInit() invoked
virtual void GameEventHandler::OnResizeWindow(int, int) -> Rendering resolution: 3024x1890
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Tilesets/easter99.j2t" opened
virtual void Death::IO::FileStream::Close() -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Tilesets/easter99.j2t" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Metadata/UI/MainMenu.res" opened
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/logo.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/logo.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/Common/snow.aura" opened
virtual void Death::IO::FileStream::Close() -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/Common/snow.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/line.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/line.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/line_arrow.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/line_arrow.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/dim.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/dim.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/glow.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/glow.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/episode_complete.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/episode_complete.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/character_art_difficulty_jazz.aura" opened
virtual void Death::IO::FileStream::Close() -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/character_art_difficulty_jazz.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/character_art_difficulty_spaz.aura" opened
virtual void Death::IO::FileStream::Close() -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/character_art_difficulty_spaz.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/character_art_difficulty_lori.aura" opened
virtual void Death::IO::FileStream::Close() -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/character_art_difficulty_lori.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/uac.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/uac.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/storage.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/storage.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/gamepad_a.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/gamepad_a.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/gamepad_b.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/gamepad_b.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/gamepad_x.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/gamepad_x.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/gamepad_y.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/gamepad_y.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/gamepad_left.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/gamepad_left.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/gamepad_right.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/gamepad_right.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/gamepad_up.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/gamepad_up.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/gamepad_down.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/gamepad_down.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/gamepad_guide.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/gamepad_guide.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/gamepad_back.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/gamepad_back.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/gamepad_start.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/gamepad_start.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/gamepad_lb.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/gamepad_lb.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/gamepad_ls.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/gamepad_ls.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/gamepad_lt.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/gamepad_lt.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/gamepad_rb.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/gamepad_rb.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/gamepad_rs.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/gamepad_rs.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/gamepad_rt.aura" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/gamepad_rt.aura" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/select_1.wav" opened
virtual void Death::IO::FileStream::Close() -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/select_1.wav" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/select_2.wav" opened
virtual void Death::IO::FileStream::Close() -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/select_2.wav" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/select_3.wav" opened
virtual void Death::IO::FileStream::Close() -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/select_3.wav" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/select_4.wav" opened
virtual void Death::IO::FileStream::Close() -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/select_4.wav" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/select_5.wav" opened
virtual void Death::IO::FileStream::Close() -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/select_5.wav" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/select_6.wav" opened
virtual void Death::IO::FileStream::Close() -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/select_6.wav" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/select_7.wav" opened
virtual void Death::IO::FileStream::Close() -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Cache/Animations/UI/select_7.wav" closed
virtual void Death::IO::FileStream::Close() -> File "Content/Metadata/UI/MainMenu.res" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/font_small.png.font" opened
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/font_small.png" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/font_small.png" closed
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/font_small.png.font" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/font_medium.png.font" opened
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "Content/Animations/UI/font_medium.png" opened
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/font_medium.png" closed
virtual void Death::IO::FileStream::Close() -> File "Content/Animations/UI/font_medium.png.font" closed
void Death::IO::FileStream::OpenStream(Death::IO::FileAccessMode) -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Source/menu.j2b" opened
virtual void Death::IO::FileStream::Close() -> File "/Users/skye/Library/Application Support/Jazz² Resurrection/Source/intro.j2b" closed
virtual void GameEventHandler::OnResizeWindow(int, int) -> Rendering resolution: 1440x810```
deathkiller commented 1 year ago

The resolution seems fine, so I don't know what's wrong then.

HomeStarRunnerTron commented 1 year ago

Interestingly enough, even if I use Parallels to run the port on Windows 11, the sprites still have a considerable amount of rescaling shimmer. Here's how it looks running in fullscreen.

widnoze

Any chance it has something to do with the fact that the screen of MacBook Pro w/ notch is unusually shaped? It might be nice to, at the very least, be able to pick something like 1920x1080 as a resolution, instead of having no actual specific screen dimensions available to choose from. Unsure of if that would fix the problem, but just thinking.

deathkiller commented 9 months ago

Added new option Unaligned Viewport (set to enabled) in Options > Graphics that could possibly solve this issue. It should also fix some other rendering glitches. So you can download the latest experimental build and let me know if it works better or not.

HomeStarRunnerTron commented 9 months ago

Thank you SO so much for your hard work. Just downloaded and tried out the most recent build from a few hours ago -- so here is a screenshot with Unaligned Viewport disabled...

unalignedviewportdisabled

And then here's with!

unalignedviewportenabled

You can see many details, like Jazz's nose and tooth are now visible correctly. MUCH better, overall. But the row of pixels at the top of his foot are still twice the length they should be-- and that kind of uneven scaling still happens all the time on each of the animations. Thank you, again! This is already a great deal more playable.

deathkiller commented 8 months ago

I reworked some rendering parts that could help with this issue. Can you download the latest experimental build and let me know if it works better or not, please? Also, try with Unaligned Viewport enabled and disabled.

HomeStarRunnerTron commented 8 months ago

INCREDIBLE! Wow, what a New Year's gift! And strangely enough, the results are, in some ways, better in reverse order from last Time.

Here's with Unaligned Viewport enabled...

withalignedviewportA

Here's with Unaligned Viewport disabled...

withoutalignedviewportA

Now, you might be thinking, where's the problem? Even if you compare pixels, all that's changing between the two is placement between the elements-- but no pixels are changing sizes.

However, if I move my character just a tiny bit and let my camera adjust, here's with Unaligned Viewport enabled...

withalignedviewportB

See how parts of the middle of the background are deformed now at the top and bottom?

But with Unaligned Viewport disabled...

withoutalignedviewportB

Harmonious between all parts of the parallaxing!

However, there is ONE bad thing about Unaligned Viewport disabled, which can be seen in how it keeps track of Jazz:

withoutalignedviewportC

There's a jitter during the active run cycle. Barely a thing, but it IS there.

Then, with Unaligned Viewport enabled, never placed a pixel behind or ahead during the run cycle:

withalignedviewportC

Between the two, I feel like Jazz staying put is better for my eyes, so I'm going to keep it on Unaligned Viewport enabled. Thank you so-so much, again!

deathkiller commented 8 months ago

Great, I hoped it will be better with these changes. I reduced camera smoothing now, I think it could prevent the issue you mention at the end. If not, I can remove the smoothing completely. I finally removed it completely now. Can you try it again?

HomeStarRunnerTron commented 8 months ago

What you did completely fixed the horizontal movement jitter on Jazz, so now the Unaligned Viewport disabled looks exactly like Unaligned Viewport enabled, during running and walking cycles.

From what I can see, only one more jitter problem exists, as I tried to stress-test the rest of the moveset. Specifically, I see vertical jitter when I try to hover with my helicopter ears.

With Unaligned Viewport disabled, jitter:

disabledhover

With Unaligned Viewport enabled, no jitter (But, of course, the background elements deform, as mentioned before -- actually, come to think of it, some of Jazz's sprites look a little deformed, too-- only slightly. Guess that's part of the tradeoff.):

enabledhover

Rock rock on, the pixel art & I thank you greatly. : D

deathkiller commented 8 months ago

I just checked original game and it seems to me, it's not pixel perfect on background either. So I added third option "Parallax Layers Only" to Unaligned Viewport that should keep everything pixel perfect except background parallax layers. I can't see much difference, so let me know what do you think. If there is no difference, I will roll the changes back.

Also, I have to do something with the camera smoothing, because it seems to me camera is too rigid now.

HomeStarRunnerTron commented 8 months ago

Sorry-- I just thought it looked nice to have the parallax layers not do the half-pixel deform. I suppose it's not QUITE pixel shimmer, which is one of my least favourite things. Anyway, it's not a dealbreaker by any means, like the original issue I came here about.

Everything looks the same as before-- with Unaligned Viewport enabled, there is no vertical jitter on the character (with slight deformation on Jazz during helicopter hover) and there is deformation on the parallax layers, with Unaligned Viewport disabled, there is vertical jitter on the character and there is no deformation on the parallax layers, with Parallax Layers Only, there is vertical jitter on the character and there is deformation on the parallax layers. And then there'd be a fourth option, if we're following the trend-- my desired setting of no vertical jitter on the character (and no deformation on Jazz during helicopter hover, if possible) and no deformation on the parallax layers, hahaha. But you've been such a help, and very patient-- thank you!

deathkiller commented 8 months ago

I mainly wanted to figure out why this happens (and ideally remove Unaligned viewport option completely). But it seems it's not possible to fix both problems at the same time. So I'm going to remove the new "Parallax Layers Only" option, because it fixes basically nothing, right? I'll probably leave everything else as it is now. And thanks for testing, I couldn't fix it without feedback.