dwgx@blog:~$dwgx
> cd ../posts

给 th06 逆向工程换底盘 拔掉 D3D8 换 SDL2/OpenGL

// created

先说清楚 这不是我从零写的 fork 自 happyhavoc/th06。一群人硬啃二进制 把《東方紅魔郷》v1.02h 逐字节逆向重建出来的源码。逆向的功劳全是他们的 我只干一件事 把底层那套 Direct3D 8 / Win32 拆了 换成 SDL2 + OpenGL。

为啥碰它 原项目要“和原版 exe 逐字节一致” 所以老老实实背着 2002 年那套古董栈 渲染 D3D8 声音 DirectSound 窗口 Win32。严谨我服 但代价是死钉在老 Windows 上 我自己机器跑起来都别扭 更别说 Linux。红魔郷逻辑不复杂 瓶颈全在那几个古董 API 上 正好拿来做“换底盘”实验。

思路就是把平台相关的抽成接口 各自实现。渲染 D3D8 换 SDL2 + OpenGL 桌面走普通 OpenGL 另外写了个 OpenGL ES 2.0 后端 RendererGLES 用 FBO 做全屏缩放 好往移动端靠 上面套 IRenderer 抽象。音频 DirectSound 换 SDL2_mixer 纹理交给 SDL2_image 窗口和帧计时收进 GameWindow。还顺手做了运行时编码检测 GBK 还是 Shift-JIS 程序自己认 不用为中日版各编一份。练习部分接了 thprac 覆盖层 选关调试直接能用。

构建换 CMake。Windows 下 SDL2 那几个库塞进 3rdparty/ 自动链接 Linux 用系统包管理器装就行。

# Windows(Win32 启用 GLES 渲染器)
cmake -B build_sdl2 -A Win32 -DUSE_GLES=ON
cmake --build build_sdl2 --config Release

跑的时候还得有原版数据(東方紅魔郷.exe v1.02h 那套) 放在可执行文件旁边。这只是换了引擎的壳 资源还是 ZUN 的原货。目前 Windows(x86/x64) 和 Linux(x86/x64 GLES) 能跑 Android 还在填坑。

老实交代 这堆 C++ 搬砖 API 替换 渲染缝合 我用了不少 LLM 辅助 翻 commit 大概率闻到 AI 味 不藏。我在意的不是代码多漂亮 是那个念头能不能成立 把逆向成果从古董 API 上解耦 让它在现代硬件上跑满 OpenGL 加速。现在它能跑 实验就算成了。游戏本身归 ZUN 逆向源码归 happyhavoc/th06 我只是在别人肩膀上换了副底盘。