N64 games show thick black borders & vertical squashing

Hi,

I’m experiencing a reproducible display issue with the N64 core in RetroArch (Mupen64Plus-Next) and need help debugging it.

Most N64 games I’ve tested display thick black bars around the image (top and bottom). The visible game image appears vertically squashed; the aspect ratio does not look like 4:3 even though the core option is set to Original (4:3). I attached a screenshot showing the issue (first attachment).

If the image were scaled to reach the top and bottom edges (i.e. remove the vertical black bars), the 4:3 aspect would look correct — so it appears the emulator is treating the black bars as if they were “part” of the rendered image. To illustrate this, I have also attached a second screenshot with the aspect ratio forced to fullscreen; the vertical black bars remain visible.

Applying the image-adjustment shader does stretch the image, but only inside the black-bar area — the rendered image stays confined within those bars.

This behaviour is consistent across multiple N64 ROMs; however, the thickness of the black bars varies from game to game. Other RetroArch systems are unaffected.

What I have already tried (no change):

  • Change video driver: Vulkan, D3D11, GL, etc.
  • Set Aspect Ratio in core options to Original (4:3) and forced 4:3 from the RetroArch menu
  • Test different RDP plugins: Angrylion, ParaLLEl-RDP, GLideN64
  • Apply / remove shaders (including image-adjustment )
  • Toggle Integer Scale ON/OFF
  • Toggle Crop Overscan ON/OFF
  • Remove core & game overrides
  • Update the core via Online Updater

Environment (system info):

  • RetroArch version: 1.21.0
  • Core: Mupen64Plus-Next
  • Video driver selected: Vulkan (also tested others)
  • OS: Windows 11
  • GPU: NVIDIA GeForce MX450
  • Monitor resolution: 1920×1080

How to reproduce (simple):

  1. Load the Mupen64Plus-Next core.
  2. Load any N64 ROM.
  3. Observe the vertical black bars and the vertically squashed image despite Aspect Ratio = Original (4:3).

I have attached a verbose retroarch_log.txt to help debug this. I can also attach any other logs or configuration files you need.

Thanks in advance — I can run tests or provide additional screenshots if needed.

[INFO] RetroArch 1.21.0 (Git 05f94af)
[INFO] === Build =======================================
[INFO] CPU Model Name: 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz
[INFO] Funcionalidades: MMX MMXEXT SSE SSE2 SSE3 SSSE3 SSE4 SSE42 AES AVX AVX2 
[INFO] Version: 1.21.0
[INFO] Git: 05f94af
[INFO] Built: Apr 30 2025
[INFO] =================================================
[INFO] [Input]: Found input driver: "dinput".
[INFO] [Environ]: SET_PIXEL_FORMAT: RGB565.
[INFO] [Core]: Versión de la API libretro: 1, API usada en la compilación: 1
[INFO] [Core]: Geometry: 320x240, Aspect: 1.333, FPS: 60.00, Sample rate: 48000.00 Hz.
[INFO] [Video]: Set video size to: 960x720.
[INFO] [XInput]: Found XInput v1.4.
[WARN] [DInput]: Strong rumble unavailable.
[WARN] [DInput]: Weak rumble unavailable.
[INFO] [Joypad]: Found joypad driver: "dinput".
[INFO] [Autoconf]: Se ha configurado Switch Pro Controller en el puerto 1.
[INFO] [D3D11]: Device created (Feature Level: 11.0)
[INFO] [D3D11]: Flip model and tear control supported and enabled.
[INFO] [D3D11]: Requesting 1 maximum frame latency, using 1.
[INFO] [D3D11]: Found GPU at index 0: "NVIDIA GeForce MX450".
[INFO] [D3D11]: Found GPU at index 1: "Intel(R) Iris(R) Xe Graphics".
[INFO] [D3D11]: Found GPU at index 2: "Microsoft Basic Render Driver".
[INFO] [D3D11]: Using GPU index 0.
[INFO] [Video]: Found display server: "win32".
[INFO] [Audio]: Set audio input rate to: 48000.00 Hz.
[INFO] [WASAPI]: Client initialized (shared, PCM, 48000Hz, 64.0ms).
[INFO] [Audio]: Started synchronous audio driver.
[INFO] [Microphone]: Initialized microphone driver.
[INFO] [Display]: Found display driver: "d3d11".
[INFO] [MIDI]: Output device: "Microsoft GS Wavetable Synth".
[INFO] [Playlist]: Cargando historial: "C:\RetroArch-Win64\content_history.lpl".
[INFO] [Playlist]: Cargando historial: "C:\RetroArch-Win64\content_music_history.lpl".
[INFO] [Playlist]: Cargando historial: "C:\RetroArch-Win64\content_video_history.lpl".
[INFO] [Playlist]: Cargando historial: "C:\RetroArch-Win64\content_image_history.lpl".
[INFO] [Playlist]: Cargando favoritos: "C:\RetroArch-Win64\content_favorites.lpl".
[INFO] [Environ]: SET_SUBSYSTEM_INFO.
[INFO] [Core]: Using content: "C:\Users\tester\OneDrive\Documentos\Emuladores\NES - SNES - N64 - GB - GBC - GBA - VB\Juegos\Nintendo 64\Super Mario 64 (Europe) (En,Fr,De).z64".
[INFO] [Core]: Content ran for a total of: 00 hours, 00 minutes, 00 seconds.
[INFO] [Core]: Unloading core..
[INFO] [Core]: Unloading core symbols..
[INFO] RetroArch 1.21.0 (Git 05f94af)
[INFO] === Build =======================================
[INFO] CPU Model Name: 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz
[INFO] Funcionalidades: MMX MMXEXT SSE SSE2 SSE3 SSSE3 SSE4 SSE42 AES AVX AVX2 
[INFO] Version: 1.21.0
[INFO] Git: 05f94af
[INFO] Built: Apr 30 2025
[INFO] =================================================
[INFO] [Input]: Found input driver: "dinput".
[INFO] [Core]: Loading dynamic libretro core from: "C:\RetroArch-Win64\cores\mupen64plus_next_libretro.dll"
[INFO] [Overrides]: Redirigiendo archivo de guardado a "C:\RetroArch-Win64\saves\Mupen64Plus-Next\Super Mario 64 (Europe) (En,Fr,De).srm".
[INFO] [Overrides]: Redirigiendo guardado rápido a "C:\RetroArch-Win64\states\Mupen64Plus-Next\Super Mario 64 (Europe) (En,Fr,De).state".
[INFO] [Environ]: GET_CORE_OPTIONS_VERSION.
[INFO] [Environ]: RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2.
[INFO] [Environ]: SET_CONTROLLER_INFO.
[INFO] [Remaps]: Game-specific remap found at "C:\RetroArch-Win64\config\remaps\Mupen64Plus-Next\Super Mario 64 (Europe) (En,Fr,De).rmp".
[INFO] [Environ]: SYSTEM_DIRECTORY: "C:\RetroArch-Win64\system".
[INFO] [Environ]: SYSTEM_DIRECTORY: "C:\RetroArch-Win64\system".
[INFO] [Environ]: GET_LOG_INTERFACE.
[INFO] [Environ]: GET_PERF_INTERFACE.
[INFO] [Environ]: SET_PIXEL_FORMAT: XRGB8888.
[INFO] [Environ]: GET_RUMBLE_INTERFACE.
[libretro INFO] mupen64plus: Using full mem base
[INFO] [Environ]: SYSTEM_DIRECTORY: "C:\RetroArch-Win64\system".
[INFO] [Content]: Cargando contenido: "C:\Users\tester\OneDrive\Documentos\Emuladores\NES - SNES - N64 - GB - GBC - GBA - VB\Juegos\Nintendo 64\Super Mario 64 (Europe) (En,Fr,De).z64".
[INFO] [Environ]: SET_HW_RENDER, context type: vulkan.
[INFO] Requesting Vulkan context.
[INFO] [Environ]: SET_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE.
[libretro INFO] mupen64plus: Goodname: Super Mario 64 (E) (M3) [!]
[libretro INFO] mupen64plus: Name: SUPER MARIO 64      
[libretro INFO] mupen64plus: MD5: 45676429EF6B90E65B517129B700308E
[libretro INFO] mupen64plus: CRC: A03CF036 BCC1C5D2
[libretro INFO] mupen64plus: Imagetype: .z64 (native)
[libretro INFO] mupen64plus: Rom size: 8388608 bytes (or 8 Mb or 64 Megabits)
[libretro INFO] mupen64plus: ClockRate = F
[libretro INFO] mupen64plus: Version: 1446
[libretro INFO] mupen64plus: Manufacturer: Nintendo
[libretro INFO] mupen64plus: Cartridge_ID: 4D53
[libretro INFO] mupen64plus: Country: Europe (0x50)
[libretro INFO] mupen64plus: PC = 80241800
[libretro INFO] mupen64plus: Save type: 0
[INFO] [Core]: Versión de la API libretro: 1, API usada en la compilación: 1
[INFO] [Core]: Geometry: 640x480, Aspect: 1.333, FPS: 50.00, Sample rate: 44100.00 Hz.
[INFO] [Video]: Set video size to: 1440x1080.
[INFO] [Video]: Using HW render, vulkan driver forced.
[INFO] [Video]: "vulkan" saved as cached driver.
[INFO] [Vulkan]: Vulkan dynamic library loaded.
[INFO] [Vulkan]: Found vulkan context: "vk_w".
[INFO] [Vulkan]: Detecting screen resolution: 1920x1080.
[INFO] [Vulkan]: Got HW context negotiation interface 2.
[INFO] [Vulkan]: Found GPU at index 0: "NVIDIA GeForce MX450".
[INFO] [Vulkan]: Found GPU at index 1: "Intel(R) Iris(R) Xe Graphics".
[INFO] [Vulkan]: Using GPU index 0.
[INFO]: Layer count: 2
[INFO]: Found layer: VK_LAYER_NV_optimus.
[INFO]: Found layer: VK_LAYER_NV_present.
[INFO]: Enabling instance extension: VK_EXT_debug_utils.
[INFO]: Using Vulkan GPU: NVIDIA GeForce MX450
[INFO]: Enabling device extension: VK_KHR_swapchain.
[INFO]: Enabling device extension: VK_KHR_sampler_mirror_clamp_to_edge.
[INFO]: Enabling device extension: VK_KHR_external_semaphore_win32.
[INFO]: Enabling device extension: VK_KHR_external_memory_win32.
[INFO]: Enabling device extension: VK_KHR_draw_indirect_count.
[INFO]: Enabling device extension: VK_EXT_calibrated_timestamps.
[INFO]: Enabling device extension: VK_EXT_conservative_rasterization.
[INFO]: Enabling device extension: VK_KHR_image_format_list.
[INFO]: Enabling device extension: VK_KHR_shader_float_controls.
[INFO]: Enabling device extension: VK_KHR_8bit_storage.
[INFO]: Enabling device extension: VK_KHR_16bit_storage.
[INFO]: Enabling device extension: VK_KHR_shader_float16_int8.
[INFO]: Enabling device extension: VK_EXT_subgroup_size_control.
[INFO]: Enabling device extension: VK_NV_compute_shader_derivatives.
[INFO]: Enabling device extension: VK_EXT_host_query_reset.
[INFO]: Enabling device extension: VK_EXT_shader_demote_to_helper_invocation.
[INFO]: Enabling device extension: VK_EXT_scalar_block_layout.
[INFO]: Enabling device extension: VK_KHR_uniform_buffer_standard_layout.
[INFO]: Enabling device extension: VK_KHR_timeline_semaphore.
[INFO]: Enabling device extension: VK_EXT_memory_priority.
[INFO]: Enabling device extension: VK_EXT_memory_budget.
[INFO]: Enabling device extension: VK_KHR_synchronization2.
[INFO]: Enabling device extension: VK_EXT_pipeline_creation_cache_control.
[INFO]: Enabling device extension: VK_KHR_format_feature_flags2.
[INFO]: Enabling device extension: VK_EXT_external_memory_host.
[INFO] [Vulkan]: Using fences for WSI acquire.
[INFO] [Vulkan]: Using GPU: "NVIDIA GeForce MX450".
[INFO] [Vulkan]: Got 3 swapchain images.
[INFO] [Vulkan]: Using resolution 1440x1080.
[INFO] [Vulkan]: Using BGRA8888 format.
[INFO] [Vulkan]: Loading stock shader.
[WARN] [DInput]: Strong rumble unavailable.
[WARN] [DInput]: Weak rumble unavailable.
[INFO] [Joypad]: Found joypad driver: "dinput".
[INFO] [Video]: Found display server: "win32".
[INFO] [Environ]: SET_INPUT_DESCRIPTORS:
[INFO] [Audio]: Set audio input rate to: 44100.00 Hz.
[INFO] [Video]: Timings deviate too much. Will not adjust. (Target = 60.00 Hz, Game = 50.00 Hz)
[INFO] [Autoconf]: Se ha configurado Switch Pro Controller en el puerto 1.
[INFO] [WASAPI]: Client initialized (shared, PCM, 48000Hz, 64.0ms).
[INFO] [Audio]: Started synchronous audio driver.
[INFO] [Microphone]: Initialized microphone driver.
[INFO] [Display]: Found display driver: "vulkan".
[INFO] [Environ]: SET_SUBSYSTEM_INFO.
[INFO] [MIDI]: Output device: "Microsoft GS Wavetable Synth".
[INFO] [Playlist]: Cargando historial: "C:\RetroArch-Win64\content_history.lpl".
[INFO] [Playlist]: Cargando historial: "C:\RetroArch-Win64\content_music_history.lpl".
[INFO] [Playlist]: Cargando historial: "C:\RetroArch-Win64\content_video_history.lpl".
[INFO] [Playlist]: Cargando historial: "C:\RetroArch-Win64\content_image_history.lpl".
[INFO] [Playlist]: Cargando favoritos: "C:\RetroArch-Win64\content_favorites.lpl".
[libretro INFO] mupen64plus: Game controller 0 (Standard controller) has a Memory pak plugged in
[libretro INFO] mupen64plus: Game controller 1 (Standard controller) has nothing plugged in
[libretro INFO] mupen64plus: Game controller 2 (Standard controller) has nothing plugged in
[libretro INFO] mupen64plus: Game controller 3 (Standard controller) has nothing plugged in
[libretro INFO] mupen64plus: Using CIC type X102
[INFO] [Environ]: SET_MEMORY_MAPS.
[WARN]: Disabling pipeline cache control.
[libretro INFO] Using 3 sync frames for parallel-RDP.
[libretro INFO] Using 2x upscaling!
[libretro INFO] paraLLEl-RDP: Using RDRAM size of 8388608 bytes.
[INFO]: Enabling upscaling: 2x.
[WARN]: Current NVIDIA driver is known to be slightly faster without 8/16-bit integer arithmetic.
[libretro INFO] mupen64plus: Initializing 4 RDRAM modules for a total of 8 MB
[libretro INFO] mupen64plus: Starting R4300 emulator: Dynamic Recompiler
[libretro INFO] mupen64plus: Init new dynarec
[WARN]: Stalled compile (compute, ae7c7d30989db128): thread 0 - 61223.900 us (mode: sync, success: yes).
[INFO] [Vulkan]: QueuePresent failed, destroying swapchain.
[INFO] [Vulkan]: Got 3 swapchain images.
[libretro INFO] mupen64plus: Enabled TLB
[INFO] [Core]: Content ran for a total of: 00 hours, 00 minutes, 38 seconds.
[INFO] [Runtime]: Saving runtime log file: "C:\RetroArch-Win64\playlists\logs\Mupen64Plus-Next\Super Mario 64 (Europe) (En,Fr,De).lrtl".
[INFO] [Video]: Restored video driver to "d3d11".
[INFO] [Core]: No hay contenido, iniciando núcleo vacío.
[INFO] [SRAM]: Guardando tipo de RAM #0 en "C:\RetroArch-Win64\saves\Mupen64Plus-Next\Super Mario 64 (Europe) (En,Fr,De).srm".
[INFO] [SRAM]: Se han guardado los datos en "C:\RetroArch-Win64\saves\Mupen64Plus-Next\Super Mario 64 (Europe) (En,Fr,De).srm".
[INFO] [Core]: Content ran for a total of: 00 hours, 00 minutes, 00 seconds.
[INFO] [Core]: Unloading game..
[INFO] [Core]: Unloading core..
[libretro INFO] mupen64plus: Stopping emulation.
[libretro INFO] mupen64plus: R4300 emulator finished.
[libretro INFO] mupen64plus: Rom closed.
[INFO] [Core]: Unloading core symbols..
plugin_start_gfx
[INFO] [Core]: Saved core options file to "C:\RetroArch-Win64\config\Mupen64Plus-Next\Mupen64Plus-Next.opt".
[INFO] RetroArch 1.21.0 (Git 05f94af)
[INFO] === Build =======================================
[INFO] CPU Model Name: 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz
[INFO] Funcionalidades: MMX MMXEXT SSE SSE2 SSE3 SSSE3 SSE4 SSE42 AES AVX AVX2 
[INFO] Version: 1.21.0
[INFO] Git: 05f94af
[INFO] Built: Apr 30 2025
[INFO] =================================================
[INFO] [Input]: Found input driver: "dinput".
[INFO] [Environ]: SET_PIXEL_FORMAT: RGB565.
[INFO] [Core]: Versión de la API libretro: 1, API usada en la compilación: 1
[INFO] [Core]: Geometry: 320x240, Aspect: 1.333, FPS: 60.00, Sample rate: 48000.00 Hz.
[INFO] [Video]: Set video size to: 960x720.
[WARN] [DInput]: Strong rumble unavailable.
[WARN] [DInput]: Weak rumble unavailable.
[INFO] [Joypad]: Found joypad driver: "dinput".
[INFO] [Autoconf]: Se ha configurado Switch Pro Controller en el puerto 1.
[INFO] [D3D11]: Device created (Feature Level: 11.0)
[INFO] [D3D11]: Flip model and tear control supported and enabled.
[INFO] [D3D11]: Requesting 1 maximum frame latency, using 1.
[INFO] [D3D11]: Found GPU at index 0: "NVIDIA GeForce MX450".
[INFO] [D3D11]: Found GPU at index 1: "Intel(R) Iris(R) Xe Graphics".
[INFO] [D3D11]: Found GPU at index 2: "Microsoft Basic Render Driver".
[INFO] [D3D11]: Using GPU index 0.
[INFO] [Video]: Found display server: "win32".
[INFO] [Audio]: Set audio input rate to: 48000.00 Hz.
[INFO] [WASAPI]: Client initialized (shared, PCM, 48000Hz, 64.0ms).
[INFO] [Audio]: Started synchronous audio driver.
[INFO] [Microphone]: Initialized microphone driver.
[INFO] [Display]: Found display driver: "d3d11".
[INFO] [Environ]: SET_SUBSYSTEM_INFO.
[INFO] [MIDI]: Output device: "Microsoft GS Wavetable Synth".
[INFO] [Playlist]: Cargando historial: "C:\RetroArch-Win64\content_history.lpl".
[INFO] [Playlist]: Cargando historial: "C:\RetroArch-Win64\content_music_history.lpl".
[INFO] [Playlist]: Cargando historial: "C:\RetroArch-Win64\content_video_history.lpl".
[INFO] [Playlist]: Cargando historial: "C:\RetroArch-Win64\content_image_history.lpl".
[INFO] [Playlist]: Cargando favoritos: "C:\RetroArch-Win64\content_favorites.lpl".
[INFO] [Config]: Se ha guardado una nueva configuración en "C:\RetroArch-Win64\retroarch.cfg".
[INFO] [Core]: Content ran for a total of: 00 hours, 00 minutes, 00 seconds.
[INFO] [Core]: Unloading core..
[INFO] [Core]: Unloading core symbols..

You didn’t mention anything about going to Settings/Video/Scaling and changing the aspect ratio from there. You need to make sure it’s correct there first, before setting it in the core options. Also, the log says your resolution is set to 1440x1080. That’s an odd resolution, it should be 1920x1080 if you have a 16:9 screen.

Super Mario has some native thin black bars on top/bottom anyway and they are bigger if you test the PAL version (most PAL games were pretty bad at this). N64 emulators and plugins are also pretty bad at detecting the overscan area in many N64 games and as a result, you get black bars around the game screen or even glitchy visuals (like the Ocarina of Time garbage icon) that normally would be hidden on a real CRT. Some games have bigger oversan areas than other, Starfox 64 has a massive oversan area that needs to be hidden.

You can hide the overscan area in the plugin options. I only use Parallel RDP and usually 8 should be fine for most games but some others need more. Don’t zoom the game image using the shader options, the oversan option should be the correct way to do this.

Many games have a black border for better performance. This was how the real N64 operates. The visible area is not 4:3, the framebuffer is.

Thanks — really appreciate the tip.

Thanks to the Crop Overscan option in ParaLLEl-RDP I was able to remove the top/bottom black bars. That’s a big step forward — thank you.

Now I have two follow-ups:

  1. After removing the bars the image is being zoomed (it fills the vertical space) and is now cropped at the left/right edges. Should I be changing any additional ParaLLEl settings to prevent this zoom/side-crop, or is this normally corrected with a shader afterwards?

  2. I do have RetroArch’s global resolution/scaling set for my monitor at 1920×1080, so I don’t understand why the verbose log shows Set video size to: 1440x1080. Is that a misconfiguration/bug I should fix, or is it expected because the core/emulator is rendering to a 4:3 canvas (i.e. 1440×1080 inside a 1920×1080 display)?

For reference I’m testing with Mupen64Plus-Next on Windows 11 (GPU: MX450). Thanks again — I can run more tests or try suggested settings and post the results.

You don’t need shaders to have a correct aspect ratio.

Also, be careful when you remove the top+bottom black bars. Some games have them visible on the real console which means if you completely remove them, you are basically zooming more than you should and you end up cropping the image, like you said. How much cropping did you set? I found that the best default value is “8”, which looks like the overscan on my old CRT. You might have some black bars on top+bottom left in the end, that’s normal, those are supposed to be there. In Waverace, they should be bigger, for example.

Some games like Banjo-Kazooie and Mischief Makers may need a bit more than “8” though.

Also, did you check the aspect ration in the Video/Scaling options? This is not in the core options, it’s in the RetroArch video settings. Set it to core provided or 4:3 for this emulator/core, whichever looks correct to you.

If you have issues with borders etc then use the adjustment shader as latest shader. Voila everything gone. It even looks better than on the original console, because the N64 had also borders in games. Escpecially pal games

Thanks — I really appreciate the help so far.

I think I understand what you meant — please correct me if I’m wrong. The top/bottom black bars are the real console’s overscan area, and PAL versions tend to have larger overscan. That explains why removing the overscan (crop) makes the image zoom and then get cropped at the left/right edges.

That leads to my real question, which is a bit different: is there any way to remove the overscan without cropping the sides? In other words, I want the rendered image to expand vertically (top and bottom) so it fills the screen height, without losing any horizontal content.

I already have Video → Scaling set to Core Provided, and I also tried forcing 4:3 as well as other aspect ratios, but that doesn’t change the behaviour: the overscan remains and, when I crop it, the image expands and the same horizontal portion of the game ends up being cropped regardless of the aspect ratio setting.

I also tried the image-adjustment shader as @papermanzero suggested. They only let me zoom the framebuffer (uniform scaling inside the current active area) or crop; I couldn’t find any option to independently stretch X and Y (i.e. apply separate horizontal scaling to make the whole image fit the width without cropping).

So my questions are:

  1. Is there a ParaLLEl (or general core) option that forces the rendered image to be scaled non-uniformly (or otherwise fit both width and height) so nothing is cropped when I remove overscan?
  2. If not, is there a specific shader that actually stretches the output area (separate horizontal/vertical scaling) rather than only zooming inside the black-bar framebuffer? If so, which exact preset/file should I use (I’m on Vulkan, so the .slangp variant)?

Thanks again — I’ll try any suggested settings and post the results.

Optimized PAL versions don’t have larger overscan, but it doesn’t look to me as if Mupen outputs any PAL games correctly anyway. Rather it treats anything uniformly as NTSC res, so nothing is output accurately by default. The output in the Retroarch scaling settings is fixed to 480 (without any upscaling ofc), which isn’t how the aspect correction normally works for other cores either.

You can check internal res and borders when you use Angrylion and take screenshots

Super Mario 64 NTSC

Super Mario 64 (USA)-260221-153127

Super Mario 64 PAL

Super Mario 64 (Europe) (En,Fr,De)-260221-154555

Paper Mario NTSC

Paper Mario (USA)-(Start)

Paper Mario PAL

Paper Mario (Europe) (Start)

A way to scale everything correctly is use RA custom scaling, on a 1080p display you can overscale. This leads to effectivly vertical 216px visible for NTSC and 270px for PAL, which is also realistic in real life.

The “overscan area” is the area that you are not supposed to see because CRTs hide it. If you play Zelda OOT with zero overscan, you can see an icon at the top left of the screen (when the minimap is ON) that is supposed to be hidden. It’s not a bug, the icon exist on the real game too, but the CRT TVs hide it.

If you set the oversvan crop value to “6”, this icon gets hidden like it should. Which means 6 is a good default value i think.

Yes, the sides will be cropped sometimes slightly but this is normal. They were cropped on the real N64 too. And yes, some times even with much larger values, you still get black bars on top and bottom of the screen. Some games even have bars at the left-right too (i think Beetle Adventure Racing has them). Again, this is normal, that’s how those games looked on the real N64. Set the value to “6” and you should be safe for 99% of games.

Which game has bars that you want to hide? I was wrong about Mario 64, if you set it to “6”, it doesn’t have any bars left, it’s only the PAL version that does. This was an issue with almost all PAL games because in Europe TVs had slightly higher vertical resolution and porting games made for NTSC resolutions without optimizing them for the different resolution, made them look this way. But there is no reason to use PAL versions, just use the US ones.

Just set it to “6”. Now if you still want to remove the top+bottom bars that you are supposed to see (like in WaveRace) you only have two options.

  • You can use a higher overscan value than normal but this will crop the game more than it should and you will lose some information on the left+right that needs to be visible.
  • You can use a shader to stretch the image vertically only. But that means the image will become distorted (and basically wrong) as everything will look stretched and thinner than they should. And spheres will look look ovals.

You can do this with the image-adjustment shader, using the “vertical overcan%” value parameter. It’s the 4th parameter in the list. This will stretch the image vertically and also mangle the pixels and destroy their uniformity as well. It’s not recommended. Just leave the black bars be IMO.

Why do your images look stretched horizontally like this?

I assume the person asking doesn’t want the games to be full screen 16:9 like this, the games are meant to be 4:3. I assume he asks for the vertical borders to be hidden only. Stretching a 4:3 image to 16:9 is just wrong and should never be done, “personal preferences” be damned.

Most PAL games actually run in an NTSC-sized frame and have black bars all around. The emulator doesn’t add the extra padding (but a lot of emulators follow this model, like BSNES). Other games do use a larger framebuffer. I believe 1080 is one such game.

Setting the overscan value to “6” for all games might not be correct. It’s the minimum you need for Zelda to completely hide the garbage icon but in Mario 64 the save select screen looks a bit wrong as it seems to hide more than it should from the sides.

So maybe “4” is a better default value to use and only set it higher in per-game basis. Zelda needs “6” to hide the garbage and Banjo-Kazooie needs “12” or more, otherwise it’s zoomed out and i know this game was full screen without bars even in PAL. Some games look fine and without vertical bars even with “0” (like 1080 Snowboarding as mentioned).

So it’s a per-game manual value. Which sucks. But whatever you set, it should not be something that distorts the image or crops it more than it should.

PAL games had bars on top+bottom only, not all around, because it’s only the vertical resolution that’s higher, the horizontal resolution is the same as in NTSC. So you didn’t get side bars.

A few games did have black bars all around though, i assume for performance reasons. Beetle Adventure Racing is one of them. But this also has those bars on NTSC as well, just a bit smaller i assume (i only have a PAL console + TV so i can’t be sure).

There was no implication anywhere here that anyone should stretch the output like that. Angrylion outputs this as an internal res screenshot, presumably because the N64 always outputs 640px width.

I guess you could say this is not the “real” internal res", similar to how on later Nintendo consoles, there is also a resolution in the framebuffer, and the final output after the graphic hardware handled it.

@anikom15 I still believe there is a problem here. Try to test for integer scanlines with PAL games.
I did this with the interlacing shader and Super Mario 64 PAL. It looks off when using an integer of 240 but aligned when using 288. This happens with both Angrylion and Paralleil Plugin. With Glide, 240 looks better, but that also applies to 1080 Snowboarding. I suspect this is because it’s not quite accurate either.

I haven’t tried AngryLion but you can set up the show statistics hotkey and use it to see the internal res from the emulator in real time. This may help with understanding what’s going on. I use Parallel-RDP and it seems that it displays correctly.

Glide is not accurate at all. It is HLE.

2 Likes

The statistics key displays 640x480 for me regardless of Angrylion or ParaLLEI plugin and NTSC or PAL. Which makes sense insofar as these are the integer scale steps that RA offers when I try it. Despite this, shaders treat the tested games as low-res 240p (as they should for NTSC games, but there is a discrepancy ofc.)

That’s odd. The size should show 640x240 for NTSC games. I will show you a screenshot of my stats screen later for comparison.

I think I got this fixed in principle by updating Retroarch, it does display 640x240 for NTSC and 640x288 for PAL size now and it looks like it scales correctly by default. But base size and max are still 640x480, which presumably screws up custom scaling factors.

The parallel renderer masking stuff on the sides with black bars if you set the cropping too high seems like a bug to me. If you use the cropping options in Beetle Saturn, Beetle PSX or Swanstation, you can crop as much as you want off the top and bottom and it won’t mask the sides. Unless you use the other option for cropping the sides. The Crash games become almost widescreen with the horizontal bars cropped off.

Base size and max don’t seem to affect shaders at all. I’m not sure how it affects custom scaling factors. If you enable logging, you can see framebuffer size used for each shader stage.

ETA: base size is probably set incorrectly by the core, as is refresh (the refresh is actually 59.82 for NTSC; the core doesn’t output a fixed fps, 60 is just an estimate).