SteonMod
RecompPlayable

Ninja's Dawn (Ninja Gaiden II recompilation)

A recompilation of the Xbox 360 Ninja Gaiden II. No game material included.

This is a recompilation for the Xbox 360 game Ninja Gaiden 2 - No game material included See the README below for details.

Ninja's Dawn

A static recompilation of Ninja Gaiden II (Xbox 360, title 544307D5) to a native Windows executable, built on the ReXGlue SDK.

It is not an emulator. The game's PowerPC code is translated ahead of time into native x86-64, so there is no interpreter and no JIT warm-up: the game runs as a Windows program, at 60 fps, with PC settings in front of it.

The graphics are native too (since v1.1.2): there is no GPU plugin. The game's Xbox 360 GPU commands are decoded on its own thread and drawn by a Direct3D 12 renderer compiled into ng2.exe, with the draw recording on a thread of its own.

Getting it: download the latest ng2recomp-vX.Y.Z-win-amd64.zip from the Releases page, unzip it anywhere, and run ng2.exe. It needs nothing installed; it does need your own copy of the game, below. Or build it yourself, further down.


What you must bring

This project ships no game data of any kind. No textures, no videos, no saves, no DLC, no executable image from the disc. You provide all of it, from your own copy.

You need all of the following:

WhatWhy
1Your own copy of Ninja Gaiden II for Xbox 360, as a disc image (.iso) or an already-extracted folder containing default.xexThis is the game. Nothing here works without it.
2Windows 10 or 11, 64-bitThe build is Windows-only.
3A GPU with Direct3D 12 and 2 GB of video memory4 GB or more if you want the upscaled texture pack.
4About 8 GB of free disk space~6.7 GB for the extracted disc, plus the port.

Optional, and only if you want the extra features:

WhatFor
Your own Xbox 360 DLC packages (the extensionless STFS files from \544307D5\00000002\)The DLC weapons and costumes.
Python 3 on PATHThe texture-pack tools. Without it the texture buttons say so and stay disabled.
Nothing more for the AI option - the Real-ESRGAN engine ships in the zip under tools/upscaler/ (third-party, BSD-3 licence)The Download button in the settings remains for an install that lost that folder; it puts a copy in the texture folder.

Since v1.0.14 the AI upscaler (Real-ESRGAN ncnn-vulkan, the x4plus model) ships in the zip at tools/upscaler/ and is the Textures page's default at detail strength 0.75. It is a local model that runs on your GPU: no account, no key, no network. Lanczos remains the fallback.

Where to get the game

Nowhere in this project, and please do not ask. Dump your own disc, or extract your own legally purchased copy. If you do not own Ninja Gaiden II, this software has nothing to offer you.


Setting it up

  1. Run ng2.exe. The first launch opens a setup screen and runs a one-time

    hardware detection to pick sensible defaults for your card.

  2. Point it at your game, either:
    • Choose folder… — a folder that already holds your extracted disc, with

      default.xex sitting in it; or

    • Choose disc image… — your own .iso, which it extracts for you

      (~6.7 GB, under a minute). The runtime mounts a folder rather than an image, which is why the copy is needed.

It reads the title ID out of the disc, so it will tell you if you have pointed it at the wrong game.

  1. Optional — point it at your DLC folder. The packages install into the

    game's content store on every launch; doing it twice is harmless.

  2. Optional — import your saves. Xbox 360 save folders can be brought in on

    the same screen.

  3. Press Play.

The setup screen comes back whenever you hold Shift while launching, or from the "Show the setup screen at the next launch" tick in the settings.


Building from source

This repository is the project's own code and documents and holds no game material. The built executable is attached to each release; this is how to make your own from your copy of the game.

  1. Tools. Visual Studio 2022 Build Tools, LLVM/Clang in `C:\Program

    Files\LLVM, Ninja and CMake, Python 3.12. The [ReXGlue](https://github.com/) SDK goes beside this folder as..\RexBlue\win-amd64(that is wheretools\build.cmdlooks); this port needs the runtime built from a tree that carries the fixes listed under *What this is built on*. The renderer is part of this repository (src/native_gpu_xlat) and is built intong2.exe`.

  2. Inputs. Put the game's default.xex in assets\ and the extracted disc

    in game\. Both folders are ignored by git and must stay that way.

  3. Generate and build. tools\build.cmd Release runs the code generation

    (rexglue codegen) and then CMake and Ninja. Two fixes live outside the generator's reach and are applied to its output by scripts; run them after any regeneration and build again (only a handful of files recompile):

   python local\diag\patch_missed_regs.py
   python local\diag\patch_scanguard.py
   tools\build.cmd Release

Every other fix is a hook declared in config\hooks\patches.toml or code under src\, and survives regeneration on its own. Do not run local\diag\patch_fix_ge2.py; its header explains why.

  1. Package. python tools\make_release.py stages a runnable folder and a

    zip under ..\Releases, with a provenance file listing the hash of every source that went in.

The full account of every problem met along the way, and its fix, is docs/ISSUES_AND_FIXES.md.


Keys

KeyWhat it does
F10The settings menu, over the running game
F9Switch the upscaled texture pack on and off, live, so you can see the difference
F8Show or hide the on-screen FPS / GPU / VRAM readouts
F4Every runtime setting, unfiltered (the SDK's own screen)
F3Frame-timing overlay
`Console
EscBack out of the settings

F9 and F8 do not write to your settings file — they are for looking, so a comparison keypress cannot overwrite the preference you chose.


Every setting

Settings that can change while the game runs do so immediately. Settings the window or the guest's video mode were built from are saved now and applied on the next launch, and are marked takes effect after a restart in red rather than accepted and quietly ignored. Changing one also puts a red "restart required" banner at the top of the menu until the game is restarted.

Display

SettingDefaultNotes
Resolution1280 × 720The size of the window, or of the surface the picture is scaled to in fullscreen. Presets run from 720p to 4K and include 21:9, 24:10 and 32:9 ultrawides, plus Custom. The game always renders 16:9 internally, so on a wider preset turn on Ultrawide (3D) below. Takes effect after a restart.
FullscreenoffBorderless fullscreen on the chosen monitor.
Monitor0Which display to open on. Takes effect after a restart.
Frame rate6030 or 60. Nothing higher is offered: Ninja Gaiden II paces its own logic off the refresh rate it is told the display has, so above 60 it does not render more smoothly, it runs faster - combat, physics and timers all speed up. A settings file holding fps=120 still loads and is brought down to 60. Takes effect after a restart.
Internal resolution1120 × 584 (as shipped)The resolution the 3D world is drawn at before it is scaled to the screen: 1120 × 584 (as shipped), 1280 × 720, 1920 × 1080, 2240 × 1168, 2560 × 1440, 3360 × 1752, 3840 × 2160, 5120 × 2880, 7680 × 4320. Built from the game's own world size (1120 × 584, 960 × 540 or 1280 × 720 - a larger world overflows the game's EDRAM layout) times a whole-number supersample, which also scales shadow maps. Cost goes with the pixel count. This row replaced the separate Internal render size and Supersampling rows in v1.1.1; the Quality preset still sets the supersample. Takes effect after a restart.
LetterboxonKeeps the original aspect instead of stretching.
Ultrawide (3D)offWidens the 3D field of view to fill a wider-than-16:9 screen with correct proportions - you see more of the world across the width, with no stretching. Full-screen menus, videos and the in-game HUD stay 16:9. Takes effect immediately.
Dither the outputoffHides colour banding on 8-bit displays. Takes effect after a restart.

V-Sync is not offered and is always on. On this title it is not a tearing control: the game advances its logic on vblank, so turning it off raises that from 60 Hz to about 1000 Hz and the game runs fast. An ng2_settings.cfg that says otherwise still loads, and the value is forced back on.

An Autodetect button re-runs the first-launch hardware detection and picks settings for your card again.

Enhancements

SettingDefaultNotes
Anisotropic filteringautoTakes effect after a restart.
Anti-aliasingnone
SharpeningbilinearBilinear, or FidelityFX CAS. Takes effect after a restart.
Extra sharpness0.0Only meaningful with CAS selected. Takes effect after a restart.
Skip intro videosoffSkips the openings and the attract demos. Chapter-loading videos are deliberately left alone — the game reads a failed open of one as a bad disc and stops.
Skip chapter cinematicsoffPresses A/START for you through the in-engine cinematic at a chapter start. Any real controller input disarms it instantly, so a cinematic you want to watch is one stick nudge away from being left alone.
Fuzzy alpha testoffWorkaround. Takes effect after a restart.
Accurate depthoffWorkaround. Takes effect after a restart.

Textures

SettingDefaultNotes
Texture folder—Where the dump and the finished pack live.
Dump while playingoffWrites each texture the first time it is seen into /dump, which is created if it is not there yet (before v1.1.3 a new folder silently got no files). Turn it off once you have a pack. Takes effect after a restart.
Use the upscaled texturesoffNeeds a pack to have been made first. F9 switches it on and off live, with a notice at the top left; a switch reloads only the textures that come from the game's data, not what the game has rendered.
Upscale factor2×2×, 4× or 8×.
UpscalerLanczosLanczos is a high-quality resample built in and needs nothing extra. Real-ESRGAN AI is a trained model that adds detail, and needs the 43 MB download plus a Vulkan-capable GPU. The AI entry only appears once the upscaler is installed.
Detail strength0.75How much of the model's fine detail is laid over the original. Not a cross-fade: the tone and colour stay the game's. Real-ESRGAN is photo-trained and denoises hard — on a smoke texture it cut mean brightness by 40%, because faint wisps against black are exactly what it treats as noise. Only the detail is taken.
Texture cacherenderer defaultHow much host memory the renderer may hold textures in, up to 8 GB. Takes effect after a restart.

Making a pack: set a folder, turn dumping on, play through the areas you care about, turn dumping off, then press Process textures. The tools run in a hidden child process and report progress in two steps (decode, then upscale); the pack is loaded on the next launch or the next F9.

The lines above the button say first how many enhanced textures the pack holds, then what the dump folder has: how many dumped textures can be enhanced, how many of those the pack already covers, and how many are waiting. "Covered" is judged the way the game itself matches textures - the same image and shape, wherever in memory it was dumped - so a texture already in the pack under another address is not counted as waiting, and "Process textures" does not redo it. HUD, fonts, video frames and other non-art are dumped too but never packed, by design, and are not counted. A run processes only the waiting textures unless Redo textures already in the pack is ticked; the line under the button says exactly what it will do and at which scale, upscaler and strength. The pack records what it was made with in pack/pack.txt; change the scale, the upscaler or the detail strength and the next run redoes every texture, and the menu says so first. "Enhanced textures: ON" below the counts, with the number of enhanced and original textures loaded, is read from the renderer and answers whether the pack is actually in use. The enhanced count covers every way a texture is swapped for its enhanced version and restarts when the pack is switched (before v1.1.3 it showed only one of them and could read a few hundred while thousands were in use).

Dumping and using the pack are mutually exclusive. Together they put a file write and a folder stat on the GPU thread for every texture the game creates, which starves the command stream - so turning one on turns the other off.

Per-stage warming. A large pack does not fit in the texture cache: 6 GB of replacements against a 4 GB ceiling means the cache evicts art it is about to need again, which is felt as stutter while a scene streams in. One stage's worth does fit. So the port records which textures each chapter actually uses - in /pack/stages/chNN.txt, listing ids rather than copying files - and reads that stage's files when the chapter loads, while a loading screen is already on screen.

The lists are built by playing. A stage you have not visited yet has no list and simply behaves as it did before, so this is never worse than not having it, and the benefit arrives on your second visit to a stage rather than your first.

GPU-ready prebuild. At a stage change the port also builds that stage's replacements ready to draw, so a texture streamed in during play swaps to its enhanced version with no file read or creation in the frame. The video memory it may use follows the graphics card: 30% of its video-memory budget, between 512 MB and 4 GB. Since v1.1.2 a card with enough memory prepares a whole stage (Chapter 14 needs about 2.2 GB); before, a 1.5 GB cap left part of it to be built mid-play, which showed as 50-200 ms hitches when an area streamed in.

On-screen readouts

SettingDefault
Show readouts (F8)off
FPSon
CPU loadon
System memory (RAM)on
GPU loadon
Video memoryon
Draw as barson
Live cost bars in this menuon

All but the last are the on-screen readout during play: FPS, CPU load, system memory (RAM), GPU load and video memory, each toggled on its own, and Draw as bars which shows them as coloured bars instead of numbers. The last is separate: the CPU/GPU/VRAM bars drawn inside the Textures section, for watching the cost move while you toggle the pack with F9.

Other

SettingDefaultNotes
Hide the cursor after5 s
Keyboard controloff
Check for updatesonOn launch, checks GitHub for a newer release and offers to download and install it, keeping your settings, game and DLC. Turn it off to never touch the network.

Report a problem

The settings menu has a Copy diagnostics to a file button. It gathers this session's log, your settings and what the machine is into one text file, copies its path to the clipboard and opens the folder. It contains no game data — but it does name your folders, so have a look before you post it.

If the game never reaches the menu, set the environment variable NG2_DIAGNOSTICS=1 and launch; the same file is written during startup.


Known issues

  • Ultrawide is a field-of-view widen, not a wider render. With **Ultrawide

    (3D)** on, the 3D field of view widens so the game fills a wider-than-16:9 screen with correct proportions; full-screen menus, videos and the in-game HUD stay 16:9. The game still renders 16:9 internally (a wider render surface breaks the console's frame resolves), so this is a field-of-view change, not a higher horizontal resolution. Leave it off (with Keep aspect ratio on) for a pillarboxed 16:9 image.

  • The attract demo froze the game in earlier versions, from a second

    ring-buffer failure unrelated to the one fixed in v1.0.0. It has not been seen since the ring fix was fully deployed, but it is not closed until a long unattended run says so.

  • Chapter-loading videos cannot be skipped, by design: the game treats one

    of them failing to open as a bad disc.

  • Achievements earned in a chapter are awarded at the next chapter load,

    not at the chapter end. The chapter transition itself is fixed (v1.0.6).

  • The AI texture option needs Python and a download this release does not

    bundle. The plain upscaler works without either, and the buttons say what is missing rather than sitting there greyed with no reason.

Fixed and no longer listed here: the red mist after a boss that never loaded the next chapter (v1.0.6), the music that died mid-session (v1.0.2), the chapter 13 boss crash (v1.0.4). Every issue ever met, with its cause and fix, is in docs/ISSUES_AND_FIXES.md.


Digging deeper

The interesting parts of this port are the investigations, not the code. They are written up in docs/:

DocumentWhat it answers
ARCHITECTURE.mdHow the pieces fit: what is in each of the three binaries, how a setting reaches the engine, and the changes that live outside any source file.
PORTING_A_NEW_GAME.mdThe whole route from a disc image to a published native release, as steps another Xbox 360 game can follow.
ISSUES_AND_FIXES.mdEvery issue met while porting, its cause and its fix, by area, from v0.1.0 to v1.1.7.
XENIA_ISSUES.mdEvery label on Xenia's compatibility issue for this title, and what this port does about each. Includes what the census does not cover.
VECTOR_COVERAGE.txtHow the garbled videos were traced to VMX128 registers v64–v127 reading as zero — including the two dead ends that ruled out the video files and the SDK's decoder first.
VIDEO_DECODE.mdThe game decodes its own WMVs in recompiled guest code; it imports no media APIs at all.
TEXTURE_PACK.mdThe texture dump/upscale/pack pipeline and its file format.
COMPATIBILITY.mdWhether the approach that produced re:Blue transfers to this title. Mostly the method does and none of the work does.
DEVELOPMENT_JOURNAL.mdThe long form, in order, including the wrong turns.

What this is built on

ReXGlue static recompilation SDK. The runtime shipped here is built from source rather than taken from a stock SDK drop, because this port depends on fixes made in that tree (the GPU fixes below now live in the renderer compiled into ng2.exe, which replaced the SDK's Xenos GPU plugin in v1.1.2):

  • **VMX128 registers v64–v127 were being localised into zero-initialised

    variables**, so the video codec's inverse-transform kernels read their permute control vectors as zero and garbled every pre-rendered video. Seven functions in the whole title did that, and all seven were the codec.

  • The GPU ring buffer's read pointer was reset without the write pointer.

    Ninja Gaiden II re-initialises the ring at every mode change, so the parser would compare a fresh read pointer against a write pointer from the ring's previous life, read that as a wrap, and execute 32 KB of dead commands. That is what froze the game at the attract demo.


Legal

The source in this repository contains no Ninja Gaiden II code, assets, or data. The executable attached to each release contains the game's code in translated form, which is what a static recompilation is; it contains no game assets or data, and it does nothing without your own copy of the game. Ninja Gaiden II is © Tecmo Koei. You must supply your own legally obtained copy.

The MIT licence in this repository applies to the project's own source — the build configuration, the tools, the launcher and its settings UI. It does not and cannot apply to anything derived from the game.

From the project's repository, fetched . Images load from GitHub.

Releases

Feed
  1. v1.1.7 v1.1.7 - ultrawide: Start and Select menus open without a wide flash Latest 753
    Release notes

    Ultrawide fix: the Start and Select menus no longer show at full width before switching to 16:9.


    v1.1.7 - 2026-09-29

    Fixed - Ultrawide: the Start and Select menus showed at full width before switching to 16:9

    On an ultrawide display, opening the Start or Select menu during play showed
    the menu at full width for a moment and then switched it to 16:9: the fade to
    black that hides the switch began only after the menu had been on screen for
    about ten frames, and then took twelve more. The fade now begins on the first
    frame the menu draws and reaches black in five frames; the menu then fades in
    at 16:9 as before. Measured in play: Start to full black 0.44 s before, 0.17 s
    now. The Select menu is drawn by the game a little later after the button,
    and fades just as quickly once it appears. Closing a menu is unchanged.

    Upgrading: unzip over your existing install, or use the in-game updater. Settings, saves and texture packs are
    untouched. An old rexgpu-xenos.dll left in the folder is no longer loaded and can be deleted.

  2. v1.1.6 v1.1.6 - ultrawide: leaving a shop no longer stretches the screen 310
    Release notes

    Ultrawide fix: leaving a shop no longer shows it stretched across the screen.


    v1.1.6 - 2026-09-29

    Fixed - Ultrawide: leaving a shop showed the shop stretched across the screen

    On an ultrawide display, leaving Muramasa's shop switched the picture to
    full width while the game was still cross-fading from the shop into play, so
    the shop's picture was shown stretched across the whole screen for about half
    a second. The switch now waits for the game's closing picture: the screen
    fades to black as soon as the shop closes, stays black while that picture is
    drawn, and fades in once, at full width, on gameplay - one fade, the way a
    level start already does it. A menu that closes without such a picture is
    unchanged. Checked in play at the shop, several times in a row
    (the log line [ng2uw] menu exit: held 16:9 for N frames says the hold ran).

    Upgrading: unzip over your existing install, or use the in-game updater. Settings, saves and texture packs are
    untouched. An old rexgpu-xenos.dll left in the folder is no longer loaded and can be deleted.

  3. v1.1.5 v1.1.5 - test tooling only (no change for play) 125
    Release notes

    Test tooling only - no change for play; updating is optional.


    v1.1.5 - 2026-09-28

    Changed - test tooling only

    Nothing changes for play. The scripted-input channel used by the project's
    automated test runs (a pad_script.txt beside the program, absent in normal
    use) now keeps input open for a moment after its last command, so a menu that
    acts when a button is released receives it even when the game window is not
    in front. Updating is optional.


    Installing: unzip and run ng2.exe. You supply your own disc rip in game\ - no game data is included or
    distributed here. A GPU with Direct3D 12 is required.

    Upgrading: unzip over your existing install, or use the in-game updater. Settings, saves and texture packs are
    untouched. An old rexgpu-xenos.dll left in the folder is no longer loaded and can be deleted.

  4. v1.1.4 v1.1.4 - settings that need a restart say so in red 51
    Release notes

    A menu change on top of v1.1.3: settings that only apply after a restart now say so in red, and changing one shows a RESTART REQUIRED banner.


    v1.1.4 - 2026-09-28

    Changed - settings that need a restart say so plainly

    Settings that only apply when the game starts (the window, the resolution,
    the internal resolution and a few others) were marked with a small
    "restart required" beside them, easy to miss. They now say
    takes effect after a restart in bright red, and changing one puts a red
    RESTART REQUIRED banner at the top of the menu, saying the change is
    saved and applies once the game is started again. The note at the bottom
    of the menu is red too.

    Several of those settings - Monitor, Resolution, Frame rate, Internal
    resolution, Sharpening - showed no mark at all: it was drawn past the edge
    of their row and cut off. It now sits under the setting when it does not fit
    beside it.


    Installing: unzip and run ng2.exe. You supply your own disc rip in game\ - no game data is included or
    distributed here. A GPU with Direct3D 12 is required.

    Upgrading: unzip over your existing install, or use the in-game updater. Settings, saves and texture packs are
    untouched. An old rexgpu-xenos.dll left in the folder is no longer loaded and can be deleted.

  5. v1.1.3 v1.1.3 - texture dumping works in a new folder 6
    Release notes

    Enhanced-texture fixes on top of v1.1.2 (the fully native release): dumping works in a new folder, switching the pack reloads less, and the texture menu and counters tell the truth about the pack.


    v1.1.3 - 2026-09-28

    Fixed - texture dumping wrote nothing into a new texture folder

    Turning on "Dump while playing" with a texture folder that had no dump
    subfolder yet wrote no files at all: nothing created that subfolder, every
    write failed without a word, and the upscaler then reported that there was
    nothing to upscale. A folder that already had one (from an earlier setup)
    was unaffected. The game now creates dump when dumping starts, and says in
    its log if a texture cannot be written.

    Checked end to end on an empty folder: dump while playing, upscale with the
    built-in upscaler, then play with the resulting pack.

    Changed - switching the texture pack (F9) or dumping reloads less

    Switching the enhanced textures on or off, or dumping on or off, used to drop
    the whole graphics cache in the middle of play, including the game's own
    rendered images. A switch now reloads only the textures that come from the
    game's data, which is all the pack or the dump needs. In the Fable II port the
    full reload could leave frames washed white, red or cyan; it was not seen in
    this game, and the lighter reload keeps it that way.

    Fixed - the texture menu made a full pack look nearly empty

    The Textures section led with figures about the dump folder, so a pack of
    tens of thousands of textures could read as "37 in the pack". It now says
    first how many enhanced textures the pack holds, and labels the rest as the
    dump folder's. A dumped texture also counts as covered when the pack has the
    same image under another address - the way the game itself matches them - and
    "Process textures" no longer redoes those.

    Fixed - the count of enhanced textures in use was wrong

    The "enhanced loaded" figure showed only one of the three ways a texture is
    swapped for its enhanced version, so it could say a few hundred while a few
    thousand were in use, and jumped back to an old number after F9 off and on.
    It now counts them all, and restarts when the pack is switched.


    Installing: unzip and run ng2.exe. You supply your own disc rip in game\ - no game data is included or
    distributed here. A GPU with Direct3D 12 is required.

    Upgrading: unzip over your existing install, or use the in-game updater. Settings, saves and texture packs are
    untouched. An old rexgpu-xenos.dll left in the folder is no longer loaded and can be deleted.

  6. v1.1.2 v1.1.2 - fully native: no GPU plugin 142
    Release notes

    The fully native release. Ninja Gaiden II's graphics now run entirely inside ng2.exe: the game's Xbox 360 GPU
    commands are decoded on its own thread and drawn by a Direct3D 12 renderer built into the program. There is no GPU
    plugin any more (rexgpu-xenos.dll is gone). Checked by walking every chapter from a full set of saves on the native
    renderer - no unhandled command, no failed draw - by playing the Chapter 10 boss fight, and by walking six chapters
    again on this exact build.

    v1.0.25, v1.1.0 and v1.1.1 were test builds and were never published, so their notes are included below, newest
    first. (v1.1.0's "Native renderer" settings row was retired in v1.1.1: the native renderer is now the only path.)


    v1.1.2 - 2026-09-28

    Changed - drawing moved off the game's thread

    The game's graphics commands are still read on the game's own thread, but the
    Direct3D 12 recording of its draws now happens on a thread of its own, fed in
    order, with every fence and interrupt kept behind the draws before it. In the
    heaviest scene measured (the Chapter 4 boss fight, about 3,000 draws a frame)
    that takes about 4.4 ms a frame off the game's thread, and the game never
    waits for the drawing thread. The frame rate was already a steady 60; this is
    headroom for high internal resolutions and busy fights.

    Fixed - hitches when a stage streams in new enhanced textures

    With the texture pack on, walking into a new area could freeze the picture
    for 50-200 ms (3-4 times in four minutes of Chapter 14). The pack prepares a
    stage's textures ahead of time, but only up to 1.5 GB, and a whole stage can
    need more (Chapter 14: 2.2 GB), so the rest were built during play. The limit
    now follows the graphics card - 30% of its video memory, up to 4 GB - so a
    card with enough memory prepares the whole stage: 0 such hitches in the same
    walks. Cards with less memory get the same budget as before.

    Changed - fully native, now also in the documentation

    The README no longer describes a GPU plugin: the renderer is part of this
    project and built into ng2.exe.

    v1.1.1 - 2026-09-28

    Changed - fully native: rexgpu-xenos.dll is gone

    The game's graphics now run entirely inside ng2.exe: the console's command
    stream is read by the program itself and every frame is drawn by its own
    Direct3D 12 renderer. rexgpu-xenos.dll is no longer shipped or loaded, and
    the "Native renderer" settings row is retired - there is only one path. A
    machine without Direct3D 12 gets a message box instead of a black window.
    Checked by walking every chapter from the saves list (no unhandled command,
    no failed draw) and by playing the Chapter 10 boss fight.

    Frames are handed to the window by a present thread of their own, so the
    game thread no longer waits for the copy to the screen.

    Added - F10 "Internal resolution"

    One row listing real render resolutions up to 8K (the world at up to 720p
    times an integer scale).

    Fixed
    • Chapter 10: the boss cinematic went black after its first frame and Ryu's

      shadow was a box. The renderer now uses the pixel-shader render-target
      path (ROV) the game's settings ask for; it had silently fallen back to a
      path this game cannot use.

    • Ultrawide, boss health bar (verified on the Chapter 4 boss): the bar now drops

      with each hit. Before, the damage showed outside the bar and the red fill
      sprang back, because the bar's cut and its plain-colour layers were not
      moved into the 16:9 HUD band with the rest of the bar.

    • Ultrawide, level start: no more flash of the stage before the loading

      icon; after a chapter card the screen holds black and the level fades in
      at full width.

    • Ultrawide, scene transitions (Chapter 7 door and others): full-screen

      transition images are no longer squeezed into the centre with the world
      showing on the sides.

    • Enhanced-texture pack: replacement textures are released with the rest of

      the texture cache and count toward its memory budget, fixing a memory
      climb over long sessions.

    ##…

  7. v1.0.24 v1.0.24 - installing leaves the setup screen ready 1.2k
    Release notes
    Changed - Installing from a disc image now leaves the setup screen ready

    After an install finished, the setup screen re-checked the game folder but not
    the downloadable content or the saves, so both still showed whatever they had
    found before - and the next step was pressing Rescan twice rather than Play.
    All three are now re-checked once when an install completes.

    The save folder is only re-scanned when one has been chosen, which is the same
    condition that enables its own Rescan button: that scan also queues the saves it
    finds for import, so running it against nothing would clear a queue nobody asked
    to clear.

    Fixed - The Resolution setting described ultrawide as impossible

    The help text on Resolution said that on a wider-than-16:9 screen the picture is
    pillarboxed with Keep aspect ratio on and stretched with it off. That is true
    only with Ultrawide (3D) turned off, and it was the whole description - so
    choosing an ultrawide resolution read as a choice between black bars and a
    distorted picture, while the setting that fixes it sat four rows below with a
    description that never mentioned resolution.

    Both settings now refer to each other. Nothing about how they work has changed:
    Ultrawide (3D) has been selectable on the first-run setup screen, and not greyed
    out, since it was added.


    Installing: unzip and run ng2.exe. You supply your own disc rip in game\

    • no game data is included or distributed here.

    Upgrading: unzip over your existing install, or use the in-game updater.
    Settings, saves and texture packs are untouched.

  8. v1.0.23 v1.0.23 - ultrawide and the scene fades are back 16
    Release notes
    Fixed - Ultrawide and the scene fades are back (regression in v1.0.22)

    v1.0.22 shipped a GPU runtime that did not contain the ultrawide support. On a
    wider-than-16:9 screen the 3D stopped filling the width and sat between black
    bars, and the full-screen scene fades - the start menu fade and the 2D chapter
    background fading into the 3D - were pillarboxed with it. Turning "Keep aspect
    ratio" off did not recover it; it stretched the picture instead, because the
    field of view was no longer being widened to compensate.

    Ninja Gaiden II's ultrawide is not one piece of code. The GPU plugin widens the
    3D projection, and the runtime decides whether the finished frame fills the
    screen or is pillarboxed - gameplay fills, menus and videos stay 16:9. The two
    halves talk through a shared setting. v1.0.22 carried a plugin that could widen
    and a runtime that could not fill, so the widen had nowhere to go.

    The release now ships a runtime that carries it, and the packaging step refuses
    to build a release whose runtime or plugin has lost an NG2 feature - the check
    that existed before compared where each file came from, not what was inside it,
    which is how this got out.

    Fixed - An interrupted update no longer leaves a half-updated install

    The updater waited up to two minutes for the game to exit and then copied the
    new files whether it had exited or not. If a file was still locked the copy
    stopped part way through and the game was relaunched with some files new and
    some old. The executable, the runtime and the GPU plugin are one matched set;
    a mismatched one exits during startup with no error and an empty log.

    It now refuses to start if the old process is still running, and stages every
    file beside its destination before moving any of them into place, so an update
    either applies completely or leaves the working install exactly as it was.
    Either way the reason is written to update\last_error.txt.


    Installing: unzip and run ng2.exe. You supply your own disc rip in game\

    • no game data is included or distributed here.

    Upgrading from v1.0.22: unzip over your existing install, or use the
    in-game updater. Settings, saves and texture packs are untouched.

    If you are on v1.0.22 and your screen has black bars either side during
    gameplay, this release is the fix.

  9. v1.0.22 v1.0.22 - a rare hang or texture corruption during heavy streaming 48
    Release notes
    Fixed - A rare hang or texture corruption during heavy streaming

    The GPU plugin uploads texture and buffer data through a pool of copy workers.
    Those workers are handed a batch of jobs at a time, and a worker draining one
    batch could claim a job belonging to the NEXT batch - one queued while it was
    still working. It then decremented a counter that had been sized for the batch
    it started on.

    Both outcomes were bad. The counter could wrap past zero, and the frame waits
    forever on a count that never reaches it - the game hangs. Or the batch is
    declared finished early, and the GPU reads an upload buffer while a worker is
    still writing into it - which is not a hang but corrupt data, drawn.

    Ninja Gaiden II's own streaming is what exposed it: an assertion added to catch
    the case fired once in 41,400 frames, in a chapter load. That is rare enough to
    have been dismissed as a one-off crash for a long time, and frequent enough to
    reach players.

    The earlier attempt at this fix pinned each worker to the batch's generation
    number, which made it rarer rather than impossible - the generation only changes
    when a batch starts, while the jobs for the next one are queued before that, so
    a worker could still be pinned to the right generation and reach the wrong work.
    Workers are now pinned to the batch's END, so a worker cannot claim past the
    batch it woke for however much the queue grows behind it.

    This is a change to the shared GPU plugin, not to the game code, so no settings
    or saves are affected. The plugin in this release is the v1.0.20 engine base
    with only the two copy-pool fixes applied, rather than a newer engine - the
    smallest change that carries the fix.


    Installing: unzip and run ng2.exe. You must supply your own disc rip in
    game\ - no game data is included or distributed here.

    Upgrading from v1.0.21: unzip over your existing install. Your settings,
    saves and texture packs are untouched. Only ng2.exe and rexgpu-xenos.dll
    change; rexruntime.dll is deliberately the same binary as v1.0.21.

  10. v1.0.21 v1.0.21 - no more settings that speed the game up 1.7k
    Release notes

    Two settings that changed game speed while presenting as smoothness or tearing
    controls are no longer offered.

    Frame rate: 120 Hz and 144 Hz are gone

    The row now offers 30 Hz and 60 Hz.

    Ninja Gaiden II paces its own logic off the refresh rate it is told the display
    has. Above 60 it does not render more smoothly, it runs faster — combat,
    physics and timers all speed up — and a player who selected 144 hit a crash. The
    row previously carried a line saying "Above 60 the game runs faster, not
    smoother", which was not enough: a menu is a promise that every option is a valid
    choice, and a warning under a broken one does not make it one.

    V-Sync is gone, for the same reason

    Off raised the guest vblank from 60 Hz to 1000 Hz, and this title advances its
    logic on vblank — so it was a game-speed control wearing the name of a tearing
    control. Anyone turning it off for input latency, as they reasonably might on any
    other game, got a game running many times too fast.

    Your existing settings still load

    Both fields still parse, so an existing ng2_settings.cfg opens as before. A file
    holding fps=144 or vsync=0 is simply brought back to 60 Hz and V-Sync on. The
    safe value is forced in the settings clamp and in the tuning that reaches the GPU
    plugin, not just hidden in the menu, so a hand-edited file cannot reintroduce the
    speed-up either.

    Not shipping: frame interpolation

    An attempt to give the smoothness those options implied without the speed-up —
    synthesizing an in-between frame so the display could run at 120 while the
    simulation stayed at 60. It worked, and was measured working in gameplay at an
    evenly-paced 120 fps with the simulation still at 60. It is not here because it
    hung the game on roughly 60% of heavy scene loads, for a structural reason rather
    than a fixable bug. The full reasoning and measurements are kept for anyone who
    revisits it.

  11. v1.0.20 v1.0.20 - Scene-transition fades are now ultrawide 1.5k
    Release notes

    ng2recomp v1.0.20

    Fixed - Scene-transition fades are now ultrawide

    The black fades that bracket every in-engine scene - chapter intros, boss-defeat
    scenes, in-engine cutscenes, area transitions - now fill the full ultrawide
    screen. Before, a fade showed as a centred 16:9 black band with the FOV-widened
    3D leaking through on the two sides.

    NG2 draws a fade as a full-screen 2D solid fill. Ultrawide compresses 2D UI to a
    centred 16:9 band so the HUD does not stretch - and that was shrinking the fade
    too. The fade is now told apart from the HUD by its rendering signature: a 2D UI
    draw that samples no texture (a solid fill). Measurement across gameplay, combat,
    menus and cards showed the fade is the ONLY such draw - the HUD, menus and
    chapter cards are all textured - so the fade is left uncompressed and covers the
    whole screen while everything else stays 16:9. This is general: any in-engine
    fade drawn this way is widened automatically, on any chapter. Verified in-game
    (fade-in and fade-out) with the HUD, weapons menu and chapter cards unaffected.

  12. v1.0.19 v1.0.19 - Ultrawide follows the game's pause/menu state 8
    Release notes

    ng2recomp v1.0.19

    Improved - Ultrawide uses the game's own pause and menu state

    Ultrawide (3D) now decides 16:9 versus ultrawide from Ninja Gaiden II's own
    state instead of only counting 3D-versus-2D draws each frame - a count that
    could not tell a paused weapons menu (the world is still drawn behind it) from
    an in-engine cinematic or a Ninpo cast (whose 2D effects spike the count, which
    is what used to make them briefly flip to 16:9).

    • **The pause / weapons (START) menu is now correctly 16:9 while cinematics and

      Ninpo stay ultrawide.** Two game globals that are set only while the pause menu
      is open - found by live memory analysis and confirmed across combat, jumps and
      Ninpo casts - drive the switch: opening the menu pillarboxes to 16:9 and
      closing it returns to ultrawide, and a Ninpo cast or an in-engine cutscene no
      longer flashes 16:9.

    • No more 16:9 flip during boss fights or Ninpo. The old draw-count ratio

      guess that caused those is gone.

    Scene-transition fades still show 16:9 (pillarboxed) - making them fill an
    ultrawide screen without stretching the HUD is queued as a follow-up, because
    the game draws a fade as a 2D layer at its own 16:9 extent. Ultrawide (3D), the
    v1.0.18 crash fixes, and everything else are unchanged.

  13. v1.0.18 v1.0.18 - crash fixes (Ninpo/boss + chapter 12->13) 4
    Release notes

    v1.0.18 - 2026-09-14

    Fixed - two crashes that slipped back into v1.0.17

    Two recompilation fixes that live as post-generation patches were silently lost
    when the translated game code was last regenerated, so v1.0.17 shipped without
    them. Both are restored:

    • A crash when using Ninpo / during a late boss. A code fragment reached by

      a branch inside one function had its saved registers re-initialised to zero
      instead of carried across, so it wrote through a null pointer. Restored the
      register hand-off (patch_missed_regs).

    • A crash at the Chapter 12 -> 13 transition. The end-of-chapter effect-list

      scanners were not null-guarded, so a freed (null) list walked off into
      unmapped memory. Restored the guard (scanguard).

    Ultrawide (3D) and everything else in v1.0.17 are unchanged.

  14. v1.0.17 v1.0.17 - Ultrawide (3D) field of view 4
    Release notes

    v1.0.17 - 2026-09-14

    Added - Ultrawide (3D) field of view

    A new Ultrawide (3D) switch on the Display screen widens Ninja Gaiden II's
    horizontal field of view to fill a wider-than-16:9 monitor with correct
    proportions: the world, characters, enemies and effects all show more across
    the width, with no stretching, and the vertical view and depth are unchanged.
    It is scene-aware - actual gameplay fills the screen while full-screen menus,
    videos and the in-game HUD stay 16:9 (pillarboxed with black bars on an
    ultrawide), so 2D art is never stretched. It takes effect immediately, with no
    restart, and is off by default.

    Under the hood the GPU plugin scales the horizontal column of each 3D draw's
    projection (a Hor+ widen that is mathematically exact), detects gameplay from
    menus by how much 3D versus 2D each frame draws, and caches the per-shader
    projection location so the widen costs no measurable frame rate.

    Fixed - the on-screen FPS readout now shows the game's frame rate

    The F8 FPS number was counted once per host present, so on a high-refresh
    monitor with V-Sync it showed the display's rate (e.g. 165) rather than the
    game's. It is now counted from the game's own main-loop frame, so it reflects
    how fast the game is actually running.

    Changed

    The fine field-of-view slider from an earlier internal build was removed; the
    Ultrawide toggle alone picks the correct field of view for the monitor.

  15. v1.0.16 Ninja's Dawn v1.0.16 10
    Release notes

    To play: download ng2recomp-v1.0.16-win-amd64.zip below, unzip it anywhere, run ng2.exe and point it at your own copy of Ninja Gaiden II (a disc image or an extracted disc folder) and, if you have them, your DLC packages. The zip holds the executable, the runtime, the Visual C++ runtime it needs, the controller database and the texture tools including the AI upscaler engine - and no game assets or data of any kind. The executable contains the game's code in translated form; without your copy of the game it does nothing. Updating an existing install: unzip over it; game\, dlc\, user\ and your settings are never touched.

    Added - the game checks for updates on launch and can install them itself

    On start-up the game now asks GitHub whether a newer release exists and, if one does, shows a prompt: Update now, What's new, or Later. Choosing to update downloads the release zip and, after a confirmation, closes the game, swaps in the new program files and reopens - you never visit the website or unzip anything by hand.

    The installer only ever replaces the program (the executable, the runtime and GPU plugin, the Visual C++ runtime, the controller database and the texture tools). game\, dlc\, user\ and your settings files are never touched - the same contract as a manual "unzip over it" update.

    The check is a background network call that never delays the boot, and the prompt appears only when there is genuinely a newer version. A new setting, "Check for updates when the game starts" (on by default), turns the whole thing off for anyone who would rather keep launch offline; the F10 settings menu also has a Check now button and shows the download progress and the same install button. The launcher talks only to the GitHub releases API and downloads only the release asset over HTTPS; nothing else leaves the machine.

    Because this is the first version with the feature, an existing v1.0.15 install cannot offer it to you automatically - update to v1.0.16 once by hand, and from here on the game keeps itself current.

    The runtime and GPU plugin are the stock pair, unchanged since v1.0.13.

  16. v1.0.15 Ninja's Dawn v1.0.15 4
    Release notes

    To play: download ng2recomp-v1.0.15-win-amd64.zip below, unzip it
    anywhere, run ng2.exe and point it at your own copy of Ninja Gaiden II (a
    disc image or an extracted disc folder) and, if you have them, your DLC
    packages. The zip holds the executable, the runtime, the Visual C++ runtime it
    needs, the controller database and the texture tools including the AI
    upscaler engine - and no game assets or data of any kind. The executable
    contains the game's code in translated form; without your copy of the game it
    does nothing. Updating an existing install: unzip over it; game\, dlc\,
    user\ and your settings are never touched.

    Fixed - the bundled AI upscaler was never looked at

    v1.0.14 put the Real-ESRGAN engine in the zip at tools/upscaler/ and made
    AI the default, but the two places that decide whether the AI is available -
    the Textures page and the pack tool - still looked only in the texture
    folder's own upscaler/, where the Download button puts a copy. On a fresh
    install the page said "not installed yet", reset the method to Lanczos, and
    every pack was made with Lanczos. Both now check the texture folder first and
    the port's tools/upscaler/ second, and the log says which copy was found.

    Changed - the pack tool decides before it decodes, and holds paths, not pixels

    Phase 1 of a full run decoded every dumped texture in pure Python before
    asking whether it was art, and kept every decoded image in memory until phase

    1. The tool now turns render targets, fonts and HUD away by shape and format

      before decoding, reuses the decoded PNG beside each raw dump when it exists,
      and keeps only the path until the chunk that needs the pixels. The output is
      byte-identical to the old tool's (185 of 185 on a 300-texture sample of this
      game's dumps); on a 196,000-dump folder phase 1 went from hours to seconds.

    Fixed - continuing a stopped run no longer keeps the previous pack's files

    A run at new settings rewrites the manifest first and then overwrites the
    pack file by file. Stopped halfway, the next run continued it and counted
    every file already in the folder as done, including the ones the old settings
    had made. Files older than the manifest of a stopped run are now redone, and
    the "already in the pack" count no longer counts a texture twice when its
    decoded PNG is in the dump folder.

    The runtime and GPU plugin are the stock pair, unchanged since v1.0.13.

  17. v1.0.14 Ninja's Dawn v1.0.14 4
    Release notes

    To play: download ng2recomp-v1.0.14-win-amd64.zip below, unzip it
    anywhere, run ng2.exe and point it at your own copy of Ninja Gaiden II (a
    disc image or an extracted disc folder) and, if you have them, your DLC
    packages. The zip holds the executable, the runtime, the Visual C++ runtime it
    needs, the controller database and the texture tools - now including the AI
    upscaler engine - and no game assets or data of any kind. The executable
    contains the game's code in translated form; without your copy of the game it
    does nothing. Updating an existing install: unzip over it; game\, dlc\,
    user\ and your settings are never touched.

    Added - the AI upscaler ships in the zip, and is the default

    The Textures page has offered Real-ESRGAN since the pack tool existed, but a
    fresh install had to fetch the engine with the Download button first, and
    until then every upscale fell back to Lanczos. The release now carries the
    engine at tools/upscaler/ (Real-ESRGAN ncnn-vulkan with the x4plus model and
    its siblings - a local model that runs on your GPU, no account, no network;
    BSD-3, third party), and AI at detail strength 0.75 is the default for new
    settings. Existing settings files keep whatever they say. The choice came out
    of the ACME Texture Upscaler comparisons and a trial on real game textures the
    same day: the AI wins clearly on hard surfaces (wood grain, rivets, edges) and
    the strength blend keeps it from turning soft organic textures to speckle. The
    Download button stays for installs that lack the folder. The runtime and GPU
    plugin are the stock pair, unchanged from v1.0.13.

  18. v1.0.13 Ninja's Dawn v1.0.13 8
    Release notes

    To play: download ng2recomp-v1.0.13-win-amd64.zip below, unzip it
    anywhere, run ng2.exe and point it at your own copy of Ninja Gaiden II (a
    disc image or an extracted disc folder) and, if you have them, your DLC
    packages. The zip holds the executable, the runtime, the Visual C++ runtime it
    needs, the controller database and the texture tools, and no game assets or
    data of any kind. The executable contains the game's code in translated form;
    without your copy of the game it does nothing. Updating an existing install:
    unzip over it; game\, dlc\, user\ and your settings are never touched.

    Fixed - streamed textures (like chapter 10) can now be upscaled

    Some stages stream many textures through the same memory addresses, and the
    pack was matching them at the wrong moment, on stale bytes, so they fell back
    to the original however well you dumped. The match now happens when the texture
    is actually loaded, on its real content. Each texture keeps its normal version,
    always drawn, and gains a separate upscaled copy only when its content is in
    the pack, so nothing can go missing. Chapter 10 went from about 400 upscaled
    textures to about 1500 with the existing pack, at full frame rate. This applies
    to every chapter; dump and process a stage as before and the textures now take
    effect.

    Changed - texture dumping takes effect on the next launch

    Turning dumping on mid-stage quietly missed the start of the stage and
    everything already loaded. It is now a restart-required setting that captures
    the whole stage from its start on the next launch.

    Everything since v1.0.6 is included. Every issue and its fix:
    docs/ISSUES_AND_FIXES.md.

  19. v1.0.12 Ninja's Dawn v1.0.12 4
    Release notes

    To play: download ng2recomp-v1.0.12-win-amd64.zip below, unzip it
    anywhere, run ng2.exe and point it at your own copy of Ninja Gaiden II (a
    disc image or an extracted disc folder) and, if you have them, your DLC
    packages. The zip holds the executable, the runtime, the Visual C++ runtime it
    needs, the controller database and the texture tools, and no game assets or
    data of any kind. The executable contains the game's code in translated form;
    without your copy of the game it does nothing. Updating an existing install:
    unzip over it; game\, dlc\, user\ and your settings are never touched.

    Fixed - switching the texture pack with F9 a few times in a row crashed the game

    Every crash of this kind had the same stack: the GPU plugin reading a 4x pack
    file into a texture created at 1x while the pack was off. The plugin now
    records the replacement chosen when a texture is created, uploads that one,
    and refuses any file whose size does not fit the texture it is going into.
    This release carries the runtime and plugin pair with that change, so F9 can
    be pressed as often as wanted, mid-load included.

    Everything since v1.0.6 is included. Every issue and its fix:
    docs/ISSUES_AND_FIXES.md.

  20. v1.0.11 Ninja's Dawn v1.0.11 3
    Release notes

    To play: download ng2recomp-v1.0.11-win-amd64.zip below, unzip it
    anywhere, run ng2.exe and point it at your own copy of Ninja Gaiden II (a
    disc image or an extracted disc folder) and, if you have them, your DLC
    packages. The zip holds the executable, the runtime, the Visual C++ runtime it
    needs, the controller database and the texture tools, and no game assets or
    data of any kind. The executable contains the game's code in translated form;
    without your copy of the game it does nothing. Updating an existing install:
    unzip over it; game\, dlc\, user\ and your settings are never touched.

    Fixed - collapsing the settings window crashed the game

    The arrow at the top left of the in-game settings window collapsed it, and
    the texture section then submitted its rows into a table that was never
    begun; the first row read through a null pointer inside the runtime. The
    window no longer offers the arrow (F10 closes it), a window that is not drawn
    ends early, and the table is guarded like every other on the page.

    Also new in the write-up: Windows keeps a crash dump for every crash the game
    has, and the catalogue now names four more crashes from the same evening that
    are still open, one of them a texture-pack upload after F9 was toggled twice
    a few seconds apart while a level streamed in.

    Everything since v1.0.6 is included. Every issue and its fix:
    docs/ISSUES_AND_FIXES.md.

Works for me

Did it work on your PC? A quick report tells other players which versions are safe to try.

Sign in to add a report

Discussion

No posts yet. Ask a question, share your setup or post a clip.

Sign in to post