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.
README
On GitHubNinja'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:
| What | Why | |
|---|---|---|
| 1 | Your own copy of Ninja Gaiden II for Xbox 360, as a disc image (.iso) or an already-extracted folder containing default.xex | This is the game. Nothing here works without it. |
| 2 | Windows 10 or 11, 64-bit | The build is Windows-only. |
| 3 | A GPU with Direct3D 12 and 2 GB of video memory | 4 GB or more if you want the upscaled texture pack. |
| 4 | About 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:
| What | For | |
|---|---|---|
Your own Xbox 360 DLC packages (the extensionless STFS files from \544307D5\00000002\) | The DLC weapons and costumes. | |
| Python 3 on PATH | The 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
- Run
ng2.exe. The first launch opens a setup screen and runs a one-timehardware detection to pick sensible defaults for your card.
- Point it at your game, either:
- Choose folder… — a folder that already holds your extracted disc, with
default.xexsitting 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.
- Choose folder… — a folder that already holds your extracted disc, with
It reads the title ID out of the disc, so it will tell you if you have pointed it at the wrong game.
- Optional — point it at your DLC folder. The packages install into the
game's content store on every launch; doing it twice is harmless.
- Optional — import your saves. Xbox 360 save folders can be brought in on
the same screen.
- 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.
- 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`. - Inputs. Put the game's
default.xexinassets\and the extracted discin
game\. Both folders are ignored by git and must stay that way. - Generate and build.
tools\build.cmd Releaseruns 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.
- Package.
python tools\make_release.pystages a runnable folder and azip 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
| Key | What it does |
|---|---|
| F10 | The settings menu, over the running game |
| F9 | Switch the upscaled texture pack on and off, live, so you can see the difference |
| F8 | Show or hide the on-screen FPS / GPU / VRAM readouts |
| F4 | Every runtime setting, unfiltered (the SDK's own screen) |
| F3 | Frame-timing overlay |
| ` | Console |
| Esc | Back 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
| Setting | Default | Notes |
|---|---|---|
| Resolution | 1280 × 720 | The 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. |
| Fullscreen | off | Borderless fullscreen on the chosen monitor. |
| Monitor | 0 | Which display to open on. Takes effect after a restart. |
| Frame rate | 60 | 30 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 resolution | 1120 × 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. |
| Letterbox | on | Keeps the original aspect instead of stretching. |
| Ultrawide (3D) | off | Widens 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 output | off | Hides 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
| Setting | Default | Notes |
|---|---|---|
| Anisotropic filtering | auto | Takes effect after a restart. |
| Anti-aliasing | none | |
| Sharpening | bilinear | Bilinear, or FidelityFX CAS. Takes effect after a restart. |
| Extra sharpness | 0.0 | Only meaningful with CAS selected. Takes effect after a restart. |
| Skip intro videos | off | Skips 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 cinematics | off | Presses 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 test | off | Workaround. Takes effect after a restart. |
| Accurate depth | off | Workaround. Takes effect after a restart. |
Textures
| Setting | Default | Notes |
|---|---|---|
| Texture folder | — | Where the dump and the finished pack live. |
| Dump while playing | off | Writes 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 textures | off | Needs 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 factor | 2× | 2×, 4× or 8×. |
| Upscaler | Lanczos | Lanczos 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 strength | 0.75 | How 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 cache | renderer default | How 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
| Setting | Default |
|---|---|
| Show readouts (F8) | off |
| FPS | on |
| CPU load | on |
| System memory (RAM) | on |
| GPU load | on |
| Video memory | on |
| Draw as bars | on |
| Live cost bars in this menu | on |
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
| Setting | Default | Notes |
|---|---|---|
| Hide the cursor after | 5 s | |
| Keyboard control | off | |
| Check for updates | on | On 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/:
| Document | What it answers |
|---|---|
| ARCHITECTURE.md | How 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.md | The whole route from a disc image to a published native release, as steps another Xbox 360 game can follow. |
| ISSUES_AND_FIXES.md | Every issue met while porting, its cause and its fix, by area, from v0.1.0 to v1.1.7. |
| XENIA_ISSUES.md | Every 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.txt | How 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.md | The game decodes its own WMVs in recompiled guest code; it imports no media APIs at all. |
| TEXTURE_PACK.md | The texture dump/upscale/pack pipeline and its file format. |
| COMPATIBILITY.md | Whether the approach that produced re:Blue transfers to this title. Mostly the method does and none of the work does. |
| DEVELOPMENT_JOURNAL.md | The 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-
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 oldrexgpu-xenos.dllleft in the folder is no longer loaded and can be deleted. -
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 framessays the hold ran).Upgrading: unzip over your existing install, or use the in-game updater. Settings, saves and texture packs are
untouched. An oldrexgpu-xenos.dllleft in the folder is no longer loaded and can be deleted. -
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 (apad_script.txtbeside 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 ingame\- 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 oldrexgpu-xenos.dllleft in the folder is no longer loaded and can be deleted. -
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 ingame\- 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 oldrexgpu-xenos.dllleft in the folder is no longer loaded and can be deleted. -
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 createsdumpwhen 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 ingame\- 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 oldrexgpu-xenos.dllleft in the folder is no longer loaded and can be deleted. -
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.dllis 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 intong2.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.dllis 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.
##…
- Chapter 10: the boss cinematic went black after its first frame and Ryu's
-
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 ingame\- 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. -
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 ingame\- 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. -
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. Onlyng2.exeandrexgpu-xenos.dll
change;rexruntime.dllis deliberately the same binary as v1.0.21. -
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.cfgopens as before. A file
holdingfps=144orvsync=0is 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. -
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. -
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. - **The pause / weapons (START) menu is now correctly 16:9 while cinematics and
-
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.
- A crash when using Ninpo / during a late boss. A code fragment reached by
-
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. -
Release notes
To play: download
ng2recomp-v1.0.16-win-amd64.zipbelow, unzip it anywhere, runng2.exeand 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.
-
Release notes
To play: download
ng2recomp-v1.0.15-win-amd64.zipbelow, unzip it
anywhere, runng2.exeand 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 ownupscaler/, 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'stools/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- 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.
- The tool now turns render targets, fonts and HUD away by shape and format
-
Release notes
To play: download
ng2recomp-v1.0.14-win-amd64.zipbelow, unzip it
anywhere, runng2.exeand 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 attools/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. -
Release notes
To play: download
ng2recomp-v1.0.13-win-amd64.zipbelow, unzip it
anywhere, runng2.exeand 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. -
Release notes
To play: download
ng2recomp-v1.0.12-win-amd64.zipbelow, unzip it
anywhere, runng2.exeand 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. -
Release notes
To play: download
ng2recomp-v1.0.11-win-amd64.zipbelow, unzip it
anywhere, runng2.exeand 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.
Discussion
No posts yet. Ask a question, share your setup or post a clip.
Sign in to post