shadPS4 如何把游戏着色器从 SPIR-V 反编译为 GLSL 并替换修改后的版本?
2026/9/12 6:11:02 网站建设 项目流程

shadPS4 如何把游戏着色器从 SPIR-V 反编译为 GLSL 并替换修改后的版本?

【免费下载链接】shadPS4PlayStation 4 emulator for Windows, Linux, macOS and FreeBSD written in C++项目地址: https://gitcode.com/GitHub_Trending/sh/shadPS4

shadPS4 运行时加载的游戏着色器以 SPIR-V 二进制(.spv)形式存在,直接查看或修改并不方便。documents/patching-shader.md 给出了一条完整的修改路径:先让模拟器把着色器转储到本地,用spirv-cross把 SPIR-V 反编译为可读的 GLSL 文本,改完再用glslc编译回 SPIR-V,把同名的.spv文件放进shader/patch目录,最后开启patchShaders选项让模拟器加载修改后的版本。本文按这条路径逐步说明操作。

前置条件:安装 Vulkan SDK 并确保工具在 PATH 中

反编译和重新编译两步都依赖外部工具,这是文档明确要求的唯一前置条件:

  • 安装 Vulkan SDK,并确保spirv-crossglslc都在 PATH 中
    • spirv-cross负责 SPIR-V → GLSL 的反编译;
    • glslc负责 GLSL → SPIR-V 的编译。

安装完成后,在终端直接输入这两个命令应能调用工具(若提示找不到命令,说明 PATH 未配置好,后续步骤无法继续)。

第一步:开启转储,让模拟器导出着色器

  1. config.toml中启用dumpShaders选项。
  2. 启动模拟器并运行游戏,模拟器会把加载到的着色器写到转储目录。

根据 documents/Debugging/Debugging.md 的配置说明,dump_shaders对应 GPU 配置项,转储路径为../user/shader/dumps(即user目录下的shader/dumps子目录)。文档中着色器文件的示例命名为fs_0x000000.spv,其中前缀标识着色器阶段,例如fs_对应 fragment(片段)着色器。转储完成后,在该目录下找到你要修改的那个.spv文件。

第二步:用 spirv-cross 反编译为 GLSL

对目标.spv文件执行文档给出的反编译命令:

spirv-cross -V fs_0x000000.spv --output fs_0x000000.glsl
  • -V指定输出为 Vulkan 风格的 GLSL;
  • 输入为你在shader/dumps中找到的.spv文件名,--output指定生成的 GLSL 文件名。

命令执行后会得到一份可读的 GLSL 源码文件,其中的变量和数值都可以正常编辑。

第三步:编辑 GLSL 并重新编译回 SPIR-V

按需要在文本编辑器中修改 GLSL 文件,然后把改动编译回 SPIR-V:

glslc --target-env=vulkan1.3 --target-spv=spv1.6 -fshader-stage=frag fs_0x000000.glsl -o fs_0x000000.spv

这里需要特别注意-fshader-stage参数:文档明确要求把它改为着色器对应的阶段(例如片段着色器用frag)。示例中的frag与文件名前缀fs_对应,编译顶点等其他阶段的着色器时,该参数要与着色器实际阶段一致,否则产物无法被正确识别。

-o之后是输出的.spv文件名,文档要求它与原始着色器同名。

第四步:放入 patch 目录并启用 patchShaders

  1. 把重新编译出的.spv文件放到shader/patch目录中,文件名与原始着色器完全一致(例如仍是fs_0x000000.spv)。模拟器正是按阶段与哈希生成的同名规则去shader/patch目录查找补丁文件(参见 vk_pipeline_cache.cpp 中PipelineCache::GetShaderPatch的实现,补丁目录为GetUserPath(PathType::ShaderDir) / "patch")。
  2. config.toml中启用patchShaders选项。
  3. 重新启动模拟器运行游戏,修改后的着色器即会替代原版被加载。

验证与结果判断

  • 反编译是否成功spirv-cross命令执行后生成了非空的.glsl文本文件,内容是可读的 GLSL 代码。
  • 编译是否成功glslc命令执行后生成了新的.spv文件。
  • 补丁是否会被采用:确认.spv文件已存在于shader/patch目录且与转储目录中的原始文件同名,并且config.tomlpatchShaders已启用。文档给出的流程到此即告完成;游戏画面中的实际效果需要自行对照修改内容判断。

限制与注意

  • 整条流程依赖spirv-crossglslc两个外部工具,缺少其中任一步都无法完成。
  • -fshader-stage必须与着色器阶段匹配,这是文档特别强调的一点。
  • 补丁文件命名规则是阶段前缀加哈希值,重命名或漏掉哈希位都会导致模拟器查不到对应补丁,请严格沿用转储出来的原文件名。
  • 修改 GLSL 后的行为完全取决于你写入的代码,文档没有对修改内容做任何限制说明;若编译后的着色器无法工作,先检查glslc命令的阶段参数是否选对。

相关文档:documents/patching-shader.md、documents/Debugging/Debugging.md。

【免费下载链接】shadPS4PlayStation 4 emulator for Windows, Linux, macOS and FreeBSD written in C++项目地址: https://gitcode.com/GitHub_Trending/sh/shadPS4

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询